सड़क अब तक
मेरा उपयोग मामला यह था कि:
- मैं संस्करण को सिंक्रनाइज़ कर रहा हूं और कई लक्ष्यों के बीच संख्याओं का निर्माण कर रहा हूं।
- मैं संस्करण को सिंक्रनाइज़ कर रहा हूं और लक्ष्य के साथ संख्याओं का निर्माण कर रहा हूं
Settigns.bundle
- मैं एक CI सर्वर से बिल्ड नंबर को पढ़ रहा हूं और संशोधित कर रहा हूं।
मैं सीआई पर ही कस्टम स्क्रिप्ट के रूप में बिंदु 1 और 2 को लक्ष्य निर्माण स्क्रिप्ट और बिंदु 3 के रूप में निष्पादित करता था।
संस्करण को स्टोर करने और Xcode बिल्ड सेटिंग्स के भीतर निर्माण का नया तरीका स्क्रिप्ट के साथ समस्या पैदा कर रहा था, क्योंकि वे अब मूल्यों को प्रभावी ढंग से संशोधित करने में सक्षम नहीं थे। कम से कम पढ़ना संभव था।
दुर्भाग्य से मैं संस्करण को स्टोर करने और प्रोजेक्ट बिल्ड सेटिंग्स में संख्याओं को बनाने से Xcode को रोकने का एक वैध तरीका खोजने में सक्षम नहीं था, हालांकि मैं एक वर्कअराउंड बनाने में कामयाब रहा।
यह पता चलता है कि जब कोई बिल्ड या आर्काइव बनाया जाता है, तो उसमें लिखे मूल्य Info.plistका उपयोग किया जाता है। इसका मतलब है कि मूल्य का निर्माण समय के दौरान किया जाता है, जो हमें उसी निर्माण समय के दौरान इसे संशोधित करने की अनुमति नहीं देता है।
मैंने xcodeprojक्ली का उपयोग करके परियोजना को संशोधित करने का भी प्रयास किया है , हालांकि परियोजना में कोई भी परिवर्तन किसी भी निर्माण को रोकने का कारण बन रहा था, इसलिए यह समाधान काम नहीं कर रहा था।
आखिरकार, बहुत सारे अलग-अलग तरीकों के बाद जो मैंने कोशिश की, मैंने आखिरकार एक समझौता किया है जो एक्सकोड के नए व्यवहार का उल्लंघन नहीं कर रहा था।
संक्षिप्त जवाब:
लक्ष्य पूर्व कार्रवाई के रूप में, एक स्क्रिप्ट निष्पादित की जाती है जो संबंधित मूल्यों को CFBundleShortVersionStringऔर CFBundleVersionलक्ष्य को लिखती हैInfo.plist
सच्चाई का एक स्रोत के रूप में, मैं Xcode निर्माण सेटिंग्स का उपयोग के मूल्यों को पढ़ने के लिए MARKETING_VERSIONऔर CURRENT_PROJECT_VERSIONवांछित लक्ष्य की।
इस तरह, जब आप प्रोजेक्ट सेटिंग्स से मानों को संशोधित करते हैं - अगले बिल्ड / संग्रह पर - उन्हें लिखा जाएगा Info.plist, जिससे कोई भी अगर आपके मौजूदा स्क्रिप्टिंग तर्क को काम करना जारी रख सके।
विस्तृत जवाब
बिल्ड एक्शन पर संसाधन को संशोधित करने का एकमात्र तरीका pre-actionस्क्रिप्ट का उपयोग करना है । यदि आप इसे बिल्ड स्क्रिप्ट से करने का प्रयास करते हैं - परिवर्तन तुरंत प्रभाव नहीं लेंगे और बिल्ड / संग्रह के अंत में मौजूद नहीं होंगे।
प्री-बिल्ड एक्शन जोड़ने के लिए - एडिट स्कीम पर जाएं।

फिर बिल्ड और आर्काइव वर्गों का विस्तार करें। के तहत Pre-action, Provide build and settings fromड्रॉपडाउन पर क्लिक करें और सत्य लक्ष्य का स्रोत चुनें जिसमें से आप मूल्यों को पढ़ना चाहते हैं।

निम्नलिखित स्क्रिप्ट जोड़ें:
# 1)
cd ${PROJECT_DIR}
# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1
# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION
विभाजन रेखाएँ निम्नलिखित कार्य करती हैं:
- उस निर्देशिका पर जाएं जहां इसे निष्पादित करने के लिए सिंक स्क्रिप्ट स्थित है
- पूर्व-क्रिया के दौरान लॉग को लिखने की अनुमति देता है, अन्यथा कोई भी आउटपुट डिफ़ॉल्ट रूप से खामोश हो जाता है
MARKETING_VERSIONऔर प्रदान करके सिंक स्क्रिप्ट निष्पादित करेंCURRENT_PROJECT_VERSION
अंतिम चरण अपनी खुद की सिंक स्क्रिप्ट लिखना है जो प्रदान किए गए मूल्यों MARKETING_VERSIONऔर CURRENT_PROJECT_VERSIONसंबंधित लक्ष्य / एस और जब भी आप चाहते हैं के मूल्यों को पढ़ता है ।
मेरे मामले में स्क्रिप्ट निम्नलिखित है:
#!/bin/bash
#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions
version_number=$1
build_number=$2
echo "version_number is $version_number"
echo "build_number is $build_number"
#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist
#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist
#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist
मैं अपने ऐप लक्ष्य के बीच साझा Info.plistऔर Settings.bundleदोनों का उपयोग करता हूं, इसलिए मुझे इसे एक बार अपडेट करना होगा।
इसके अलावा, मैं एक अधिसूचना सेवा विस्तार का उपयोग करता हूं BadgeCounter, जिसमें सटीक एक ही संस्करण होना चाहिए और लक्ष्य के रूप में निर्माण करना चाहिए जिसमें यह एम्बेडेड है। इसलिए मैं इसे भी अपडेट करता हूं।