मैं अपने एप्लिकेशन की सेटिंग बंडल में एप्लिकेशन संस्करण संशोधन कैसे प्रदर्शित कर सकता हूं?


91

मैं अपने एप्लिकेशन की सेटिंग बंडल में एप्लिकेशन संस्करण और आंतरिक संशोधन, 1.0.1 (r1243) जैसे कुछ को शामिल करना चाहूंगा।

Root.plist फ़ाइल में इस तरह का एक टुकड़ा होता है ...

     <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

एक और समाधान है जो पिछले उत्तरों की तुलना में बहुत सरल हो सकता है। Apple अपने अधिकांश इंस्टालर्स के अंदर एक कमांड-लाइन टूल, जिसे PlistBuddy कहा जाता है, और इसे तेंदुए में शामिल किया है /usr/libexec/PlistBuddy

चूंकि आप प्रतिस्थापित करना चाहते हैं VersionValue, इसलिए मान लें कि आपके पास संस्करण मान निकाला गया है $newVersion, तो आप इस आदेश का उपयोग कर सकते हैं:

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

तलछट या नियमित अभिव्यक्तियों के साथ बेला करने की आवश्यकता नहीं है, यह दृष्टिकोण काफी सीधा है। विस्तृत निर्देशों के लिए मैन पेज देखें । आप संपत्ति सूची में किसी भी प्रविष्टि को जोड़ने, हटाने या संशोधित करने के लिए PlistBuddy का उपयोग कर सकते हैं। उदाहरण के लिए, मेरा एक दोस्त प्लिस्टबड्डी का उपयोग करके Xcode में बिल्ड नंबर बढ़ाने के बारे में ब्लॉग करता है।

नोट: यदि आप प्लास्ट को सिर्फ पथ की आपूर्ति करते हैं, तो PlistBuddy इंटरैक्टिव मोड में प्रवेश करता है, इसलिए आप परिवर्तनों को सहेजने का निर्णय लेने से पहले कई कमांड जारी कर सकते हैं। मैं निश्चित रूप से इसे आपकी बिल्ड स्क्रिप्ट में बंद करने से पहले करने की सलाह देता हूं।


20
मेरी पलस्तर में संस्करण संख्या को संदर्भित करने का सही तरीका जानने के लिए मुझे कुछ समय लगता है; मेरे मामले में यह / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "सेट वरीयताएँ: 0: DefaultValue $ newversion" - उम्मीद है कि अन्य लोगों के लिए उपयोगी होगा।
जोसेफ

क्विन टेलर, जोसेफ, आपके उत्तरों के लिए धन्यवाद, मैं Settings.bundle में अपने ऐप्स संस्करण संख्या को स्वचालित रूप से लागू करने में सक्षम था। +1 आप दोनों के लिए ;-)
निको

7
कस्टम "रन स्क्रिप्ट" बिल्ड चरण से, मुझे रूट.प्लिस्ट में अधिक पथ शामिल करने की आवश्यकता थी: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "सेट वरीयताएँ: 0: DefaultValue $ newVersion "
क्रिस वासेली

2
बस पूर्णता के लिए, यहाँ PListBuddy woth एक और दृष्टिकोण है कि मेरे लिए काम किया है: xcodehelp.blogspot.com/2012/05/...
कोएन

सबसे सही तरीका है/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala

66

मेरे आलसी आदमी का समाधान मेरे आवेदन कोड से संस्करण संख्या को अद्यतन करना था। आपके पास अपने स्टार्टअप कोड में कहीं और रूट (।) में एक डिफ़ॉल्ट (या रिक्त) मान हो सकता है:

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

एकमात्र कैच यह है कि आपके ऐप को कम से कम एक बार अपडेटेड वर्जन के लिए सेटिंग पैनल में दिखाना होगा।

उदाहरण के लिए, आप आगे और अपडेट ले सकते हैं, उदाहरण के लिए, आपके एप्लिकेशन को कितनी बार लॉन्च किया गया है, या जानकारी के अन्य रोचक बिट्स का एक काउंटर।


9
यह तब काम करेगा जब उपयोगकर्ता आपके ऐप को लॉन्च करने से पहले सेटिंग्स में चला जाएगा ।
मोशे

9
@ सच, ​​लेकिन इस सुरुचिपूर्ण ढंग से संभालने के लिए, आप केवल .plist फ़ाइल के भीतर एक डिफ़ॉल्ट मान निर्दिष्ट कर सकते हैं, शायद 'नॉट अभी तक लॉन्च' जैसी कोई चीज
कार्लोस पी

1
हालांकि अधिकांश डेवलपर्स शायद CFBundleShortVersionStringऔर CFBundleVersionउसी मूल्य पर सेट होते हैं , CFBundleShortVersionStringवास्तव में वही है जो ऐप्पल चाहता है कि आप अपने जारी किए गए संस्करण पर विचार करें , जो कि आप उपयोगकर्ताओं को दिखाते हैं। CFBundleVersionसंभावित रूप से एक आंतरिक संस्करण संख्या हो सकती है, जिसे आप संभवतः उपयोगकर्ताओं को नहीं दिखा सकते हैं (यदि यह अलग है)।
नैट

3
क्या मैं कुछ भूल रहा हूँ? यह वास्तव में मैं क्या कर रहा हूँ, लेकिन मूल्य नहीं बदला है। क्या आप लोग एक शीर्षक संपत्ति का उपयोग नहीं कर रहे हैं, जो मेरा मानना ​​है कि केवल पढ़ा जाता है?
सैमसन

2
एप्लिकेशन को अपडेट करते समय एक और समस्या भी है। अपडेट किए गए एप्लिकेशन को कम से कम एक बार लॉन्च किए जाने तक सेटिंग बंडल अभी भी पुराने बिल्ड संस्करण को प्रदर्शित करेगा।
21

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"
    
  • MyAppName को अपने वास्तविक ऐप के नाम से बदलें, और वरीयता के बाद 1 सेटिंग्स में अपने संस्करण प्रविष्टि का सूचकांक हो। उपरोक्त Root.plist उदाहरण में यह सूचकांक 1 पर है।


मुझे लगता है कि यह जाने का सबसे अच्छा तरीका है
टोनी

मैंने यह कोशिश की और मुझे अपनी सेटिंग्स बंडल में शीर्षक मान बदलते हुए दिखाई दे रहा है। शीर्षक InAppSettingsKit में दिखाई देता है, लेकिन प्रारंभिक संस्करण से मान नहीं बदलता है। सेटिंग ऐप में शीर्षक कभी दिखाई नहीं देता है। मैं
हार मान

इस विधि का उपयोग करते समय सेटिंग केवल पढ़ने के लिए नहीं है। यानी मैं settings.app में संस्करण संख्या सेटिंग में टैप कर सकता हूं और यह संपादन योग्य है।
गति

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"
लुइस एस्कॉर्ब

1
आप ${INFOPLIST_PATH}जानकारी के लिए उपयोग कर सकते हैं plist पाथ
तोमर यहां तक ​​कि

23

बेन क्लेटन के प्लस्ट https://stackoverflow.com/a/12842530/338986 का उपयोग करना

Run scriptनिम्नलिखित स्निपेट के साथ जोड़ें 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। रास्ता अलग-अलग हो सकता है।

Xcode 7.3.1 पर परीक्षण


1
यदि आप स्क्रिप्ट को प्रोजेक्ट स्कीम के बिल्ड, प्री-एक्शन सेक्शन में जोड़ते हैं तो यह सबसे अच्छा उत्तर है। एंडी के जवाब को देखो।
वाहिद अमीरी

2
यह मेरे लिए काम कर रहा है। बस आप के लिए विशिष्ट होने के लिए "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)

यहाँ Root.plist मैं Settings.bundle में मिला है:

<?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(और यह महसूस नहीं किया कि आपको प्लिस्ट फ़ाइलों की इतनी आसान पहुंच दी गई है, या तो)
Dov

इसके लिए शुक्रिया। एक संशोधन - जैसा कि आपके पास अभी है, यह स्रोत में बदलाव करता है, बिल्डडीर के लिए नहीं - जिसका अर्थ है कि आप अपने डिवाइस पर या सिम्युलेटर में जो देखते हैं वह हमेशा वास्तविक बिल्ड संस्करण के पीछे एक बिल्ड संस्करण होगा। इसे ठीक करने के लिए, मैंने आपकी स्क्रिप्ट को पहले स्रोत पर पुन: व्यवस्थित करने के लिए संशोधित किया, फिर बिल्डडीर भी। settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... और भी, मैं गीतांश को जोड़ता हूं:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod

8

अन्य उत्तर एक कारण से सही ढंग से काम नहीं करते हैं: रन स्क्रिप्ट बिल्ड चरण को तब तक निष्पादित नहीं किया जाता है जब तक कि सेटिंग्स बंडल को पैक नहीं किया जाता है। इसलिए, यदि आपका Info.plist संस्करण 2.0.11 है और आप इसे 2.0.12 तक अपडेट करते हैं, तो अपनी परियोजना का निर्माण / संग्रह करें, सेटिंग्स बंडल अभी भी 2.0.11 कहेंगे। यदि आप सेटिंग बंडल को खोलते हैं Root.plist, तो आप देख सकते हैं कि संस्करण संख्या बिल्ड प्रक्रिया के अंत तक अपडेट नहीं होती है। आप सेटिंग को सही ढंग से अपडेट करने के लिए प्रोजेक्ट को फिर से बना सकते हैं, या आप इसके बजाय प्री-बिल्ड चरण में स्क्रिप्ट जोड़ सकते हैं ...

  • XCode में, अपने प्रोजेक्ट लक्ष्य के लिए स्कीम संपादित करें
  • BUILD स्कीम पर प्रकटीकरण तीर पर क्लिक करें
  • फिर, "पूर्व-क्रिया" आइटम पर क्लिक करें
  • प्लस साइन पर क्लिक करें और "नया रन स्क्रिप्ट एक्शन" चुनें
  • शेल वैल्यू को / bin / sh पर सेट करें
  • अपने प्रोजेक्ट लक्ष्य के लिए "से बिल्ड सेटिंग प्रदान करें" सेट करें
  • अपनी स्क्रिप्ट को टेक्स्ट क्षेत्र में जोड़ें। निम्नलिखित स्क्रिप्ट ने मेरे लिए काम किया। आपको अपने प्रोजेक्ट सेटअप से मिलान करने के लिए पथों को संशोधित करना पड़ सकता है:

    versionString = $ (/ usr / libexec / PlistBuddy -c "प्रिंट CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "सेट वरीयताएँ: 0: DefaultValue $ versionString"

यह स्क्रिप्ट को सही ढंग से चलाएगा क्योंकि सेटिंग्स बंडल निर्माण / संग्रह प्रक्रिया के दौरान पैक किया जाता है। यदि आप सेटिंग बंडल को खोलते हैं। Root.plist और अपनी परियोजना का निर्माण / संग्रह करें, तो आप अब देखेंगे कि बिल्ड प्रक्रिया की शुरुआत में संस्करण संख्या अपडेट की गई है और आपकी सेटिंग बंडल सही संस्करण प्रदर्शित करेगा।


धन्यवाद, केवल आपका समाधान सही बिल्ड संस्करण दिखाता है। दो बार बनाने के लिए आवश्यक अन्य समाधान।
बोरिस वाई।

यह अभी भी मेरे लिए एक दूसरे निर्माण की आवश्यकता है,
पैट्रिक

@Patrick iOS सेटिंग ऐप कभी-कभी पुरानी जानकारी को बरकरार रखता है। परिवर्तन को देखने के लिए, आपको सेटिंग्स ऐप को मारना और पुनः आरंभ करना होगा।
एंडी

1
BTW, मुझे इस स्क्रिप्ट को जोड़ने का एक सरल तरीका मिला है: अपने प्रोजेक्ट लक्ष्य के बिल्ड चरणों में जाएं और "+" आइकन पर क्लिक करें। "नया रन स्क्रिप्ट चरण" चुनें और वहां स्क्रिप्ट कोड जोड़ें। यह कुंजी है: लक्ष्य निर्भरता के तहत, बिल्ड चरणों की सूची के शीर्ष पर नई रन स्क्रिप्ट को क्लिक करें और खींचें, लेकिन संकलित स्रोतों से पहले। यह प्री-बिल्ड स्क्रिप्ट के समान व्यवहार करेगा और इसे खोजना आसान होगा।
एंडी

धन्यवाद @Andy, बिल्ड चरणों टैब में जोड़ने का आपका समाधान पूरी तरह से काम किया।
पैट्रिक

7

Xcode 11.4 के साथ, आप अपने एप्लिकेशन की सेटिंग बंडल में एप्लिकेशन संस्करण प्रदर्शित करने के लिए निम्न चरणों का उपयोग कर सकते हैं।


सेट $(MARKETING_VERSION)और $(CURRENT_PROJECT_VERSION)चर

नोट: यदि $(MARKETING_VERSION)और $(CURRENT_PROJECT_VERSION)चर के लिए दिखाई देते हैं Bundle version string (short)और Bundle versionमें कुंजी Info.plist , आप निम्न चरणों को छोड़ और अगले भाग पर जा सकेंगे।

  1. Xcode प्रोजेक्ट खोलें।
  2. प्रोजेक्ट नेविगेटर खोलें ( cmd1), अपनी परियोजना की सेटिंग्स को प्रकट करने के लिए अपनी परियोजना का चयन करें फिर ऐप लक्ष्य का चयन करें।
  3. का चयन करें सामान्य टैब।
  4. में पहचान अनुभाग, बदल संस्करण कुछ नए मूल्य (जैसे करने के लिए क्षेत्र की सामग्री 0.1.0) और बदल बिल्ड कुछ नए मूल्य (जैसे करने के लिए क्षेत्र की सामग्री 12)। ये 2 परिवर्तन Info.plist फ़ाइल में बनाएंगे $(MARKETING_VERSION)और $(CURRENT_PROJECT_VERSION)चर बनाएंगे ।

सेटिंग्स बंडल बनाएं और कॉन्फ़िगर करें

  1. में परियोजना नेविगेटर , अपना प्रोजेक्ट चुनें।
  2. चुनें फ़ाइल > नई > फ़ाइल ... ( cmdN)।
  3. IOS टैब का चयन करें ।
  4. संसाधन अनुभाग में सेटिंग्स बंडल का चयन करें , फिर अगला और बनाएं पर क्लिक करें
  5. 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>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
जॉर्डन एच

2
यह मेरे लिए काम किया:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
जॉर्डन एच

धन्यवाद। यह मेरे लिए क्या दुनिया है। लेकिन मेरा नाम सेटिंग्स- Watch.bundle रखा गया और ($build)
कर्ट लेन

3

मैं pListcompiler ( 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. पीएलसी फ़ाइल में प्रीप्रोसेसर निर्देश हो सकते हैं, जैसे #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode पर्यावरण चर। इसलिए मैं निम्नलिखित निर्देश को जोड़कर चर kRevisionNumber का संदर्भ देने में सक्षम था

    #include "Revision.h"
    
  4. मैंने हर बार जब परियोजना का निर्माण किया जा रहा है, तो उसे चलाने के लिए अपने xcode लक्ष्य के लिए एक कस्टम स्क्रिप्ट बिल्ड चरण जोड़ा

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

और वह यह था!


प्लिस्ट फाइल में सिंगल वैल्यू को बदलने के लिए यह बहुत काम की तरह लगता है ... प्लिस्ट बिल्डिंग करते समय वैरिएबल एक्सेस करने में सक्षम होना वैचारिक रूप से अच्छा है, लेकिन प्लिस्ट फाइल के लिए टूल बिल्ड का उपयोग करना ज्यादा आसान है। मैं अपने उत्तर में प्लिस्टबड्डी का वर्णन करता हूं - इसे एक शॉट दें!
क्विन टेलर

3

@Ben Clayton जवाब और @Luis एस्कॉर्ब और @ वाहिद अमीरी की टिप्पणियों पर आधारित मेरा काम करने का उदाहरण:

नोट: यह दृष्टिकोण रिपॉजिटरी की वर्किंग कॉपी में Settings.bundle / Root.plist फाइल को संशोधित करता है

  1. अपने प्रोजेक्ट रूट में एक सेटिंग बंडल जोड़ें। इसका नाम मत बदलो

  2. SourceCode के रूप में 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>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

उपरोक्त उत्तर मेरे काम नहीं आए इसलिए मैंने अपनी कस्टम स्क्रिप्ट बनाई।

यह गतिशील रूप से Root.plist से प्रविष्टि को अद्यतन करता है

नीचे रन स्क्रिप्ट का उपयोग करें। X 10.3 में सत्यापित सत्यापित के लिए डब्ल्यू बीमार काम।

"var buildVersion" शीर्षक में प्रदर्शित किया जाने वाला संस्करण है।

और पहचानकर्ता का नाम सेटिंग में शीर्षक के लिए नीचे "var संस्करण" है ।undle Root.plist

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

Root.plist में उदाहरण प्रविष्टि

    <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>

कार्य नमूना Root.plist प्रविष्टि


1

मेरा मानना ​​है कि आप इस तरीके का उपयोग करके ऐसा कर सकते हैं जो इस उत्तर में वर्णित है ( इस पोस्ट के आधार पर )।

सबसे पहले, आप $ {VERSIONVALUE} का नाम बदलकर VersionValue को Xcode के भीतर एक चर बना सकते हैं। एक फ़ाइल बनाएं जिसका नाम 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

जब ये मान आपकी परियोजना के भीतर बदलते हैं, तो इसे चर को बदलने की कोशिश करनी चाहिए।


यदि मैं संस्करण संख्या को Info.plist फ़ाइल में एम्बेड करना चाहता हूं तो यह काम करता है। लेकिन मैं इसे अन्य plist फ़ाइलों के लिए काम नहीं कर सकता उदाहरण के लिए Root.plist फ़ाइल जो Settings.bundle में स्थित है। क्या ऐसी कोई सेटिंग है जिसे मैं इसे सक्षम करने के लिए उपयोग कर सकता हूं?
पनियागोटिस कोरोस

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.