আমি কীভাবে আমার অ্যাপ্লিকেশনটির সেটিংস বান্ডেলে অ্যাপ্লিকেশন সংস্করণ সংশোধন প্রদর্শন করতে পারি?


91

আমি আমার অ্যাপ্লিকেশনটির সেটিংস বান্ডলে অ্যাপ্লিকেশন সংস্করণ এবং অভ্যন্তরীণ সংশোধন, 1.0.1 (r1243) এর মতো কিছু অন্তর্ভুক্ত করতে চাই।

রুট.পালিস্ট ফাইলটিতে এই জাতীয় একটি খণ্ড রয়েছে ...

     <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>Key</key>
        <string>version_preference</string>
        <key>DefaultValue</key>
        <string>VersionValue</string>
        <key>Values</key>
        <array>
            <string>VersionValue</string>
        </array>
        <key>Titles</key>
        <array>
            <string>VersionValue</string>
        </array>
    </dict>

এবং আমি বিল্ড সময় "ভার্সনওয়ালু" স্ট্রিংটি প্রতিস্থাপন করতে চাই।

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা আমার সংগ্রহশালা থেকে সংস্করণ নম্বরটি বের করতে পারে, আমার যা প্রয়োজন তা হ'ল বিল্ড টাইম সময়ে রুট.পলিট ফাইলটি প্রক্রিয়া করার (প্রাক প্রক্রিয়া) করার উপায় এবং উত্স ফাইলটিকে প্রভাবিত না করে সংশোধন নম্বরটি প্রতিস্থাপন করতে পারে।

উত্তর:


69

পূর্বের উত্তরগুলির তুলনায় আরও সহজ সমাধান হতে পারে solution অ্যাপল তার বেশিরভাগ ইনস্টলারের ভিতরে প্লিস্টবাডি নামে একটি কমান্ড-লাইন সরঞ্জাম বান্ডিল করে এবং এটিকে চিতাবাঘে অন্তর্ভুক্ত করে /usr/libexec/PlistBuddy

যেহেতু আপনি প্রতিস্থাপন করতে চান VersionValue, ধরে নিই যে আপনার কাছে সংস্করণটির মান প্রবেশ করা হয়েছে $newVersion, আপনি এই আদেশটি ব্যবহার করতে পারেন:

/usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist

সেড বা নিয়মিত এক্সপ্রেশন দিয়ে গলগল করার দরকার নেই, এই পদ্ধতিরটি বেশ সোজা। বিস্তারিত নির্দেশাবলীর জন্য ম্যান পৃষ্ঠাটি দেখুন । আপনি কোনও সম্পত্তি তালিকায় কোনও এন্ট্রি যুক্ত করতে, অপসারণ করতে বা সংশোধন করতে প্লাস্টবাড্ডি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আমার এক বন্ধু প্লিসটবডি ব্যবহার করে এক্সকোডে বিল্ড সংখ্যা বাড়ানোর বিষয়ে ব্লগ করেছেন ।

দ্রষ্টব্য: আপনি প্লাস্টের কেবল পথ সরবরাহ করলে, প্লিস্টবাডি ইন্টারেক্টিভ মোডে প্রবেশ করে, যাতে আপনি পরিবর্তনগুলি সংরক্ষণ করার সিদ্ধান্ত নেওয়ার আগে একাধিক আদেশ জারি করতে পারেন। আমি অবশ্যই আপনার বিল্ড স্ক্রিপ্টে এটি চাপানোর আগে এটি করার পরামর্শ দিচ্ছি।


20
আমার প্লিস্টের সংস্করণ নম্বরটি উল্লেখ করার সঠিক উপায়টি বের করতে আমার কিছুটা সময় মনে হচ্ছে; আমার ক্ষেত্রে এটি / usr / lixec / PlistBuddy সেটিংস পরিণত হয়েছে le
জোসেফ এইচ

কুইন টেলর, জোসেফ এইচ, আপনার উত্তরগুলির জন্য ধন্যবাদ, আমি স্বয়ংক্রিয়ভাবে সেটিংস.বান্ডেলে আমার অ্যাপ্লিকেশন সংস্করণ নম্বরটি প্রয়োগ করতে সক্ষম হয়েছি। আপনার উভয়ের জন্য +1 ;-)
নিকো

7
একটি কাস্টম "রান স্ক্রিপ্ট" বিল্ড ফেজ থেকে আমার রুট.পালিস্টের আরও অনেকগুলি পথ অন্তর্ভুক্ত করা দরকার: / usr / libexec / PlistBuddy {AR TARGET_BUILD_DIR} / $ UL FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "সেট পছন্দসংশ্লিষ্ট: 0: ডিফল্টভ্যালু V নতুন সংস্করণ "
ক্রিস ভাসেল্লি

4
শুধু সম্পূর্ণতার জন্য, এখানে PListBuddy woth আরেকটি পন্থা যে আমার জন্য কাজ হল: xcodehelp.blogspot.com/2012/05/...
Koen

সবচেয়ে সঠিক উপায়/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
কাম্বালা

66

আমার অলস লোকটির সমাধানটি ছিল আমার অ্যাপ্লিকেশন কোড থেকে সংস্করণ নম্বর আপডেট করা। আপনার রুট.পালিস্টে একটি ডিফল্ট (বা ফাঁকা) মান থাকতে পারে এবং তারপরে, আপনার সূচনা কোডের কোথাও:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];

একমাত্র ক্যাচটি হ'ল সেটিংস প্যানেলে আপডেট হওয়া সংস্করণটির জন্য আপনার অ্যাপ্লিকেশনটি কমপক্ষে একবার চালানো উচিত।

আপনি ধারণাটি আরও গ্রহণ করতে এবং আপডেট করতে পারেন, উদাহরণস্বরূপ, আপনার অ্যাপ্লিকেশনটি কতবার চালু হয়েছে তার পাল্টা, বা তথ্যের অন্যান্য আকর্ষণীয় বিট।


9
যদি ব্যবহারকারী আপনার অ্যাপ্লিকেশন আরম্ভ করার আগে সেটিংসে না যায় তবে এটি কাজ করবে ।
মোশে

9
@ মোশে ট্রু, তবে এটিকে মার্জিতভাবে পরিচালনা করার জন্য, আপনি কেবলমাত্র .plist ফাইলের মধ্যে একটি ডিফল্ট মান নির্দিষ্ট করে দিতে পারেন, সম্ভবত 'এখনও চালু হয়নি'
কার্লোস পি

4
যদিও অধিকাংশ ডেভেলপার সম্ভবত সেট CFBundleShortVersionStringএবং CFBundleVersionএকই মান চাই, CFBundleShortVersionStringকি আসলে অ্যাপল আপনি আপনার বিবেচনা করতে চায় মুক্তি সংস্করণ , যা হবে, তা ব্যবহারকারীদের কাছে প্রদর্শন করুন। CFBundleVersionসম্ভবত কোনও অভ্যন্তরীণ সংস্করণ নম্বর হতে পারে, যা আপনার সম্ভবত ব্যবহারকারীদের দেখাতে হবে না (যদি এটি পৃথক হয়)।
নট

4
আমি কিছু অনুপস্থিত করছি? এটি হ'ল আমি যা করছি ঠিক ততটাই, তবে মান পরিবর্তন হয় না। আপনি কি ছেলেরা কোনও শিরোনাম সম্পত্তি ব্যবহার করছেন না, যা আমি বিশ্বাস করি যে এটি কেবল পঠনযোগ্য?
স্যামসন

4
অ্যাপ্লিকেশন আপডেট করার সময় আরও একটি সমস্যা রয়েছে। আপডেট অ্যাপ্লিকেশনটি কমপক্ষে একবার চালু না হওয়া পর্যন্ত সেটিংস বান্ডেলটি এখনও পুরানো বিল্ড সংস্করণটি প্রদর্শন করবে।
লেগোলেস

61

@ কুইন এর উত্তরের ভিত্তিতে, আমি এখানে এটি করার জন্য সম্পূর্ণ প্রক্রিয়া এবং ওয়ার্কিং কোড ব্যবহার করি।

  • আপনার অ্যাপ্লিকেশনটিতে একটি সেটিংস বান্ডিল যুক্ত করুন। নাম পরিবর্তন করবেন না।
  • একটি পাঠ্য সম্পাদকটিতে Settings.bundle / Root.plist খুলুন

সামগ্রীগুলি এর সাথে প্রতিস্থাপন করুন:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>DummyVersion</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
  • একটি রান স্ক্রিপ্ট বিল্ড ফেজ তৈরি করুন , অনুলিপি বান্ডিল রিসোর্স ফেজের পরে স্থানান্তর করুন । এই কোড যুক্ত করুন:

    cd "${BUILT_PRODUCTS_DIR}"
    buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" )
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
    
  • সেটিংসে আপনার সংস্করণ প্রবেশের সূচী হতে মাই অ্যাপ্লনেমটি আপনার আসল অ্যাপের নাম এবং 1 পছন্দসই পরে স্পিফাইফায়ারগুলির সাথে প্রতিস্থাপন করুন। উপরের রুট.প্লেস্ট উদাহরণটি সূচক 1 এ রয়েছে।


আমার মনে হয় এটি যাওয়ার সেরা উপায়
টনি

আমি এটি চেষ্টা করেছি এবং আমি দেখতে পাচ্ছি শিরোনাম মানটি আমার সেটিংসের বান্ডেলে পরিবর্তিত হচ্ছে। শিরোনামটি ইন অ্যাপসেটেটিং কিটে প্রদর্শিত হবে, তবে প্রাথমিক সংস্করণ থেকে মান পরিবর্তন হয় না। সেটিংস অ্যাপটিতে শিরোনামটি কখনই উপস্থিত হয় না। আমি ছেড়ে দিচ্ছি এবং আমি যখন একটি মেনুতে 'সম্পর্কে' নির্বাচন করি তখন আমি একটি ডায়ালগ পপ আপ করতে যাচ্ছি
বাগগাফ

এই পদ্ধতিটি ব্যবহার করার সময় সেটিংসটি কেবল পঠিত হয় না। অর্থাৎ আমি সেটিংস.এপসে সংস্করণ নম্বর সেটিংটিতে আলতো চাপতে পারি এবং এটি সম্পাদনাযোগ্য।
গতিবেশন

8
@ বেন-ক্লেটন পুট বাশ স্ক্রিপ্টটি আমার পক্ষে কাজ করে নি, তাই আমি তার উত্তরের ভিত্তিতে এটি পুনরায় তৈরি করেছি, এটি এখানে:buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
লুইস অ্যাসকরবে

4
আপনি ${INFOPLIST_PATH}তথ্যের বিস্তৃত পথের জন্য ব্যবহার করতে পারেন
টোমর ইভেন

23

বেন ক্লেটনের প্লাস্ট ব্যবহার https://stackoverflow.com/a/12842530/338986

যোগ Run scriptপর snippet অনুসরণের মাধ্যমে Copy Bundle Resources

version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

সংযোজন CFBundleVersionএর ছাড়াও CFBundleShortVersionString। এটি এর মতো সংস্করণ নির্গত করে:

লেখার $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist পরিবর্তে এর মধ্যে $SRCROOTকিছু সুবিধা রয়েছে।

  1. এটি সংগ্রহস্থলের অনুলিপিগুলিতে ফাইলগুলি সংশোধন করে না।
  2. তোমার ক্ষেত্রে পাথ প্রয়োজন হবে না Settings.bundleযে $SRCROOT। পথ বিভিন্ন হতে পারে।

এক্সকোড 7.3.1 এ পরীক্ষা করা হচ্ছে


4
আপনি যদি প্রকল্পের স্কিমের বিল্ড, প্রাক-ক্রিয়া বিভাগে স্ক্রিপ্টটি যুক্ত করেন তবে এটি সেরা উত্তর আইএমও। অ্যান্ডির উত্তর দেখুন।
ওয়াহিদ আমিরি

4
এটা আমার জন্য কাজ করছে। আপনার সুনির্দিষ্ট হতে কেবল "DefaultValue" পরিবর্তন করতে ভুলবেন না। উদাহরণস্বরূপ, আমি পাদলেখ পরিবর্তন করতে চেয়েছিলাম তাই আমি "ফুটারটেক্সট" ব্যবহার করেছি। "পছন্দসই স্পেসিফায়ার্স" এর পরে আপনাকেও নম্বরটি পরিবর্তন করতে হবে যাতে এটি প্লাস্টের আইটেমটির সাথে সংযুক্ত থাকে।
রিচার্ড উইথারস্পুন

12

উদাহরণস্বরূপ উপর ভিত্তি করে এখানে , এখানে স্ক্রিপ্ট আমি স্বয়ংক্রিয়ভাবে সেটিংস বান্ডিল সংস্করণ সংখ্যা আপডেট করার জন্য ব্যবহার করছি রয়েছে:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle
settings_key = 'version_preference' # the key of your settings version

# these are used for testing only
info_path = '/Users/mrwalker/developer/My_App/Info.plist'
settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist'

# these environment variables are set in the XCode build phase
if 'PRODUCT_SETTINGS_PATH' in os.environ.keys():
    info_path = os.environ.get('PRODUCT_SETTINGS_PATH')

if 'PROJECT_DIR' in os.environ.keys():
    settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path)

# reading info.plist file
project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path)
project_bundle_version = project_plist['CFBundleVersion']

# print 'project_bundle_version: '+project_bundle_version

# reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
  for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = project_bundle_version

# print repr(settings_plist)
settings_plist.writeToFile_atomically_(settings_path, True)

সেটিংস.বান্ডেলটিতে যে রুট.প্লেস্টটি পেয়েছে তা এখানে:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>1.0.0.0</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

খুব দরকারী - পাইথন থেকে প্লিস্টবাডি চালাতে আমার সমস্যা হচ্ছে, এবং আমি কখনই ব্যবহার করার কথা ভাবিনি NSDictionary(এবং বুঝতে পারিনি যে এটি আপনাকে প্লাস্ট ফাইলগুলিতে এত সহজ অ্যাক্সেস দিয়েছে, হয়)
ডভ

এই জন্য আপনাকে ধন্যবাদ. একটি পরিবর্তন - আপনার এখন যেমন রয়েছে, এটি উত্সটিতে পরিবর্তন করেছে, বিল্টডির নয় - যার অর্থ আপনার ডিভাইসে বা সিমুলেটে আপনি যা দেখেন তা প্রকৃত বিল্ড সংস্করণের পিছনে সর্বদা একটি বিল্ড সংস্করণ হবে। এটি ঠিক করার জন্য, আমি প্রথমে আপনার স্ক্রিপ্টটি পুনরুক্ত করে উত্সের উপর দিয়ে বিল্টডির, অর্থাৎ। সেটিংস_পথ_বিল্ড = os.path.join (os.en वातावरण.get ('TARGET_BUILD_DIR'),
সেটিংস_ফाइल_পাথ_বিল্ড

... এবং এছাড়াও, আমি গীতাশ সংযোজন:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod

8

অন্য উত্তরগুলি এক কারণে সঠিকভাবে কাজ করে না: সেটিংস বান্ডেলটি প্যাকেজ না হওয়া পর্যন্ত রান স্ক্রিপ্ট বিল্ড ফেজটি কার্যকর করা হয় না। সুতরাং, যদি আপনার তথ্য.পালিস্ট সংস্করণটি 2.0.11 হয় এবং আপনি এটি 2.0.12 এ আপডেট করেন তবে আপনার প্রকল্পটি তৈরি করুন / সংরক্ষণাগারভুক্ত করুন, সেটিংস বান্ডেলটি এখনও 2.0.11 বলবে। আপনি যদি সেটিংস বান্ডেল রুট.পালিস্টটি খুলেন তবে দেখতে পাবেন যে বিল্ড প্রক্রিয়া শেষ না হওয়া অবধি সংস্করণ নম্বর আপডেট হয় না। সেটিংস বান্ডেলটি সঠিকভাবে আপডেট হতে আপনি আবার প্রকল্পটি তৈরি করতে পারেন, বা আপনি স্ক্রিপ্টটি একটি প্রাক-বিল্ড পর্যায়ে যুক্ত করতে পারেন ...

  • এক্সকোডে, আপনার প্রকল্পের টার্গেটের জন্য স্কিমটি সম্পাদনা করুন
  • বিল্ড স্কিমের প্রকাশ তীরটি ক্লিক করুন
  • তারপরে, "প্রাক-ক্রিয়াগুলি" আইটেমটি ক্লিক করুন
  • প্লাস চিহ্নটি ক্লিক করুন এবং "নতুন রান স্ক্রিপ্ট অ্যাকশন" নির্বাচন করুন
  • শেল মানটি / বিন / এস-এ সেট করুন
  • আপনার প্রকল্পের টার্গেটে "বিল্ড সেটিংস সরবরাহ করুন" সেট করুন
  • পাঠ্য অঞ্চলে আপনার স্ক্রিপ্ট যুক্ত করুন। নিম্নলিখিত স্ক্রিপ্ট আমার জন্য কাজ করে। আপনার প্রকল্প সেটআপের সাথে মেলে তুলতে আপনাকে পাথগুলি সংশোধন করতে হবে:

    ভার্সন স্ট্রিং = $ (/ usr / lixec / PlistBuddy -c "মুদ্রণ সিএফবান্ডেল ভার্শন" "$ {PROJECT_DIR} / $ F INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "সেট পছন্দসংশ্লিষ্ট: 0: DefaultValue ault versionString"

বিল্ড / সংরক্ষণাগার প্রক্রিয়া চলাকালীন সেটিংস বান্ডেলটি প্যাক করার আগে এটি সঠিকভাবে স্ক্রিপ্টটি চালাবে run আপনি যদি সেটিংসের বান্ডিল রুট.পালিস্টটি খোলেন এবং আপনার প্রকল্পটি তৈরি / সংরক্ষণাগারভুক্ত করেন, আপনি এখন বিল্ড প্রক্রিয়াটির শুরুতে সংস্করণ নম্বরটি আপডেট হওয়া দেখতে পাবেন এবং আপনার সেটিংস বান্ডেলটি সঠিক সংস্করণটি প্রদর্শন করবে।


আপনাকে ধন্যবাদ, শুধুমাত্র আপনার সমাধানটি সঠিক বিল্ড সংস্করণ দেখায়। অন্যান্য সমাধান দুটিবার তৈরি করা প্রয়োজন।
বরিস ওয়াই।

এটি এখনও আমার জন্য একটি দ্বিতীয় বিল্ড প্রয়োজন, এক্সকোড 10.0
প্যাট্রিক

@ পেট্রিক আইওএস সেটিংস অ্যাপ কখনও কখনও পুরানো তথ্য ধরে রাখে। পরিবর্তনটি দেখতে, আপনাকে সেটিংস অ্যাপ্লিকেশনটি মেরে আবার চালু করতে হবে।
অ্যান্ডি

4
বিটিডাব্লু, আমি এই স্ক্রিপ্টটি যুক্ত করার একটি সহজ উপায় খুঁজে পেয়েছি: আপনার প্রকল্পের টার্গেটের বিল্ড পর্যায়গুলি ট্যাবে যান এবং "+" আইকনটি ক্লিক করুন। "নতুন রান স্ক্রিপ্ট ফেজ" চয়ন করুন এবং সেখানে স্ক্রিপ্ট কোড যুক্ত করুন। এটি মূলসূত্র: টার্গেট নির্ভরতাগুলির অধীনে, তবে সংস্থার উত্সের আগে, নতুন রান স্ক্রিপ্টটি বিল্ড পর্যায়গুলির তালিকার শীর্ষে ক্লিক করুন এবং টেনে আনুন Sources এটি প্রাক-বিল্ড স্ক্রিপ্ট হিসাবে একই আচরণ করবে এবং এটি খুঁজে পাওয়া সহজ।
অ্যান্ডি

ধন্যবাদ অ্যান্ডি, বিল্ড ফেজস ট্যাবে যুক্ত করার আপনার সমাধানটি পুরোপুরি কার্যকর হয়েছে।
প্যাট্রিক

7

এক্সকোড 11.4 এর সাহায্যে আপনি আপনার অ্যাপ্লিকেশনটির সেটিংস বান্ডলে অ্যাপ্লিকেশন সংস্করণটি প্রদর্শনের জন্য নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করতে পারেন।


সেট $(MARKETING_VERSION)এবং $(CURRENT_PROJECT_VERSION)ভেরিয়েবল

দ্রষ্টব্য: যদি $(MARKETING_VERSION)এবং $(CURRENT_PROJECT_VERSION)ভেরিয়েবলগুলি ইনফো.প্লিস্টেBundle version string (short) এবং Bundle versionকীগুলির জন্য উপস্থিত হয় তবে আপনি নিম্নলিখিত পদক্ষেপগুলি এড়িয়ে যেতে এবং পরবর্তী বিভাগে যেতে পারেন।

  1. এক্সকোড প্রকল্পটি খুলুন।
  2. প্রকল্প নেভিগেটর খুলুন ( cmd1), আপনার প্রকল্পের সেটিংস প্রকাশ করতে আপনার প্রকল্প নির্বাচন করুন এবং তারপরে অ্যাপ্লিকেশন লক্ষ্যটি নির্বাচন করুন।
  3. সাধারণ ট্যাবটি নির্বাচন করুন ।
  4. ইন পরিচয় অধ্যায় পরিবর্তন সংস্করণ কিছু নতুন মান (যেমন মাঠে বিষয়বস্তু 0.1.0) এবং পরিবর্তন বিল্ড কিছু নতুন মান (যেমন মাঠে বিষয়বস্তু 12)। এই 2 টি পরিবর্তনগুলি তথ্য.প্লেস্ট ফাইলটিতে তৈরি $(MARKETING_VERSION)এবং $(CURRENT_PROJECT_VERSION)ভেরিয়েবল তৈরি করবে ।

সেটিংস বান্ডিলটি তৈরি এবং কনফিগার করুন

  1. ইন প্রকল্প ন্যাভিগেটর , আপনার প্রকল্পের নির্বাচন করুন।
  2. ফাইল > নতুন > ফাইল… ( cmdN) নির্বাচন করুন ।
  3. আইওএস ট্যাবটি নির্বাচন করুন ।
  4. নির্বাচন করুন সেটিং বান্ডেল মধ্যে রিসোর্স অধ্যায়, তারপরে পরবর্তী এবং তৈরি করুন
  5. রুট.পালিস্ট নির্বাচন করুন এবং সোর্স কোড হিসাবে এটি খুলুন। নীচের কোড দিয়ে এর বিষয়বস্তু প্রতিস্থাপন করুন:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>DefaultValue</key>
            <string></string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

একটি রান স্ক্রিপ্ট যুক্ত করুন

  1. ইন প্রকল্প ন্যাভিগেটর , আপনার প্রকল্পের নির্বাচন করুন।
  2. অ্যাপ্লিকেশন লক্ষ্য নির্বাচন করুন।
  3. বিল্ড পর্যায়সমূহের ট্যাবটি নির্বাচন করুন ।
  4. + > নতুন রান স্ক্রিপ্ট ফেজ ক্লিক করুন ।
  5. কপি বান্ডিল রিসোর্স বিভাগের উপরে কোথাও নতুন পর্বটি টেনে আনুন । এইভাবে, অ্যাপ্লিকেশনটি সংকলনের আগে স্ক্রিপ্টটি কার্যকর করা হবে।
  6. সদ্য যুক্ত হওয়া রান স্ক্রিপ্ট পর্বটি খুলুন এবং নিম্নলিখিত স্ক্রিপ্টটি যুক্ত করুন:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

এপ্লিকেশন চালু করুন

  1. cmdRডিভাইস বা সিমুলেটারে পণ্য ( ) চালান ।
  2. ডিভাইস বা সিমুলেটরটিতে একবার অ্যাপ্লিকেশন চালু হওয়ার পরে সেটিংস অ্যাপ্লিকেশনটি খুলুন এবং তৃতীয় পক্ষের অ্যাপ্লিকেশনগুলির তালিকায় আপনার অ্যাপ্লিকেশনটি নির্বাচন করুন। অ্যাপ্লিকেশনটির সংস্করণটি নীচের মত প্রদর্শিত হবে:


সূত্র


এটি আমার জন্য একটি ত্রুটি ছুড়ে ফেলেছেSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
জর্ডান এইচ

4
এটি আমার পক্ষে কাজ করেছে:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
জর্ডান এইচ

ধন্যবাদ এই আমার জন্য বিশ্বের। তবে আমার নামটি সেটিংস-ওয়াচ.বান্ডেল নামকরণ করা হয়েছিল এবং 19:30 এ($build)
কর্ট লেন

3

আমি পিস্টলিস্টকম্পিলার ( http://sourceforge.net/projects/plistcompiler) ব্যবহার করে যা চাইছিলাম তা করতে পেরেছি ) ওপেন সোর্স পোরজেক্ট পেরেছি।

  1. এই সংকলকটি ব্যবহার করে আপনি নীচের ফর্ম্যাটটি ব্যবহার করে একটি .plc ফাইলে সম্পত্তি ফাইলটি লিখতে পারেন:

    plist {
        dictionary {
            key "StringsTable" value string "Root"
            key "PreferenceSpecifiers" value array [
                dictionary {
                    key "Type" value string "PSGroupSpecifier"
                    key "Title" value string "AboutSection"
                }
                dictionary {
                    key "Type" value string "PSTitleValueSpecifier"
                    key "Title" value string "Version"
                    key "Key" value string "version"
                    key "DefaultValue" value string "VersionValue"
                    key "Values" value array [
                        string "VersionValue"
                    ]
                    key "Titles" value array [
                        string "r" kRevisionNumber
                    ]
                }
            ]
        }
    }
    
  2. আমার একটি কাস্টম রান স্ক্রিপ্ট বিল্ড ফেজ ছিল যা ব্র্যাড-লারসন এখানে বর্ণিত হিসাবে আমার রেপোজিটরি রিভিশনটি .h ফাইল থেকে বের করে নিচ্ছিল ।

  3. পিএলসি ফাইলটিতে প্রিপ্রসেসর নির্দেশাবলী থাকতে পারে, যেমন # ডেফাইন, # ম্যাসেজ, # আইফ, # এলিফ, # অন্তর্ভুক্ত, # বিশিষ্ট, # আইডিডিডিফ, # সেলস, # প্রগমা, # ত্রুটি, # আইফেন্ডেফ, #endif, এক্সকোড পরিবেশ পরিবর্তনশীল। সুতরাং আমি নিম্নলিখিত নির্দেশটি যুক্ত করে kRevisionNumber পরিবর্তনশীলটি উল্লেখ করতে সক্ষম হয়েছি

    #include "Revision.h"
    
  4. প্রজেক্টটি প্রতিবার বিল্ডিংয়ের সময় প্লামকম্পাইলার চালানোর জন্য আমি আমার এক্সকোড টার্গেটে একটি কাস্টম স্ক্রিপ্ট বিল্ড ফেজও যুক্ত করেছি

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
    

এবং এটি ছিল!


এটি কেবলমাত্র একটি প্লিস্ট ফাইলে একক মানকে প্রতিস্থাপন করার জন্য প্রচুর পরিশ্রমের মতো মনে হচ্ছে ... প্লিস্ট তৈরির সময় কোনও ভেরিয়েবল অ্যাক্সেস করতে সক্ষম হওয়াই ধারণাগতভাবে দুর্দান্ত তবে প্লাস্ট ফাইলের জন্য একটি সরঞ্জাম বিল্ড ব্যবহার করা আরও সহজ। আমি আমার উত্তরে প্লিস্টবাডি বর্ণনা করছি - এটি একটি শট দিন!
কুইন টেলর

3

@ বেন ক্লেটন উত্তর এবং @ লুইস এসকার্বি এবং @ ওয়াহিদ আমিরির মন্তব্যের ভিত্তিতে আমার কাজের উদাহরণ:

দ্রষ্টব্য: এই পদ্ধতিটি সংগ্রহস্থলের অনুলিপি কার্যবিধিতে সেটিংস.বান্ডেল / রুট.পল্লিস্ট ফাইলটি পরিবর্তন করে

  1. আপনার প্রকল্পের মূলটিতে একটি সেটিংস বান্ডিল যুক্ত করুন। নাম পরিবর্তন করবেন না

  2. উত্সকোড হিসাবে সেটিংস.বান্ডেল / রুট.পুলিট খুলুন

    সামগ্রীগুলি এর সাথে প্রতিস্থাপন করুন:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    
  3. প্রকল্প (লক্ষ্য) প্রকল্পের বিল্ড, প্রাক-ক্রিয়া বিভাগে নিম্নলিখিত স্ক্রিপ্টটি যুক্ত করুন

    version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
    build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
    
  4. বর্তমান স্কিমটি তৈরি করুন এবং রান করুন


2

উপরের উত্তরগুলি আমার পক্ষে কাজ করে না তাই আমি আমার কাস্টম স্ক্রিপ্ট তৈরি করেছি।

এটি রুট.পালিস্ট থেকে গতিশীলভাবে এন্ট্রি আপডেট করে

নীচে রান স্ক্রিপ্ট ব্যবহার করুন। এক্সকোড 10.3 এ যাচাই করা নিশ্চিত হওয়ার জন্য ডাব্লু খারাপ কাজ।

"var buildVersion" শিরোনামে প্রদর্শিত সংস্করণ।

এবং শনাক্তকারীর নামটি নীচে "ভার্সন সংস্করণ" রয়েছে সেটিংস.বান্ডেল রুট.পুলিস্টে শিরোনামের জন্য

cd "${BUILT_PRODUCTS_DIR}"

#set version name to your title identifier's string from settings.bundle
var version = "Version"

#this will be the text displayed in title
longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}")
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH})
buildVersion="$shortVersion.$longVersion"

path="${WRAPPER_NAME}/Settings.bundle/Root.plist"

settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l`

for (( idx=0; idx<$settingsCnt; idx++ ))
do
#echo "Welcome $idx times"
val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}`
#echo $val

#if ( "$val" == "Version" )
if [ $val == "Version" ]
then
#echo "the index of the entry whose 'Key' is 'version' is $idx."

# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path

# just to be sure that it worked
ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path`
#echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver

fi

done

রুট.প্লেস্টে প্রবেশের উদাহরণ Example

    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>DefaultValue</key>
        <string>We Rock</string>
        <key>Key</key>
        <string>Version</string>
    </dict>

কাজ করে নমুনা রুট.প্লেস্ট এন্ট্রি


1

আমি বিশ্বাস করি আপনি একটি উত্তম উপায় ব্যবহার করে এটি করতে পারেন যা আমি এই উত্তরে বর্ণিত হব ( এই পোস্টের উপর ভিত্তি করে )।

প্রথমত, আপনি এক্সকোডের মধ্যে Version ERS ভার্সনওয়ালু nam এর নাম পরিবর্তন করে সংস্করণওয়ালুকে একটি পরিবর্তনশীল করতে পারেন} Versionvalue.xcconfig নামে একটি ফাইল তৈরি করুন এবং এটি আপনার প্রকল্পে যুক্ত করুন। আপনার অ্যাপ্লিকেশন টার্গেটে যান এবং সেই লক্ষ্যটির জন্য বিল্ড সেটিংসে যান। আমি বিশ্বাস করি যে আপনাকে ব্যবহারকারী-সংজ্ঞায়িত বিল্ড সেটিং হিসাবে VERSIONVALUE যুক্ত করতে হবে। সেই উইন্ডোর নীচের ডানদিকে-কোণে, ভিত্তিক অন মানটিকে "সংস্করণ" -এ পরিবর্তন করুন।

শেষ অবধি, আপনার লক্ষ্যে যান এবং একটি স্ক্রিপ্ট বিল্ড ফেজ তৈরি করুন। স্ক্রিপ্টের সেই রান স্ক্রিপ পর্যালোচনা করুন এবং স্ক্রিপ্ট পাঠ্য ক্ষেত্রের মধ্যে আপনার স্ক্রিপ্টে আটকান। উদাহরণস্বরূপ, আমার সাবস্ক্রিন বিল্ডের সাথে আমার BUILD_NUMBER সেটিং ট্যাগ করার জন্য আমার স্ক্রিপ্টটি নিম্নরূপ:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

আপনার প্রকল্পের মধ্যে যখন এই মানগুলি পরিবর্তন হয় তখন চলকটি প্রতিস্থাপনের কৌশলটি করা উচিত।


আমি তথ্য.পলিট ফাইলটিতে সংস্করণ নম্বর এম্বেড করতে চাইলে এটি কাজ করে। তবে আমি এটিকে অন্য প্লাস্ট ফাইলগুলির জন্য কাজ করতে পারি না উদাহরণস্বরূপ সেটিংস.বান্ডলে অবস্থিত রুট.প্লেস্ট ফাইল। এটি সক্ষম করতে আমি কি কোনও বিল্ড সেটিং ব্যবহার করতে পারি?
পানাজিওটিস কররোস

0

আমার জন্য এটি সবচেয়ে সহজ সমাধান ছিল:

কপি বান্ডিল রিসোর্স পদক্ষেপের আগে নতুন স্ক্রিপ্ট বিল্ড ফেজ যুক্ত করুন

শেল: /usr/bin/env python

সামগ্রী:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

# Key to replace
settings_key = 'version_preference' # the key of your settings version

# File path
settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist"

# Composing version string
version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_VERSION') + ")"

# Reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = version_string

# Save new settings
settings_plist.writeToFile_atomically_(settings_path, True)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.