Saya ingin memasukkan versi aplikasi dan revisi internal, seperti 1.0.1 (r1243), dalam bundel pengaturan aplikasi saya.
File Root.plist berisi fragmen seperti ini ...
<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>
dan saya ingin mengganti string "VersionValue" pada waktu pembuatan.
Saya memiliki skrip yang dapat mengekstrak nomor versi dari repositori saya, yang saya butuhkan adalah cara untuk memproses (pra-proses) file Root.plist, pada waktu pembuatan, dan mengganti nomor revisi tanpa mempengaruhi file sumber.
sumber
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
Solusi orang malas saya adalah memperbarui nomor versi dari kode aplikasi saya. Anda dapat memiliki nilai default (atau kosong) di Root.plist dan kemudian, di suatu tempat di kode startup Anda:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; [[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];
Satu-satunya tangkapan adalah bahwa aplikasi Anda harus dijalankan setidaknya sekali agar versi yang diperbarui muncul di panel pengaturan.
Anda dapat mengambil ide lebih jauh dan memperbarui, misalnya, penghitung berapa kali aplikasi Anda diluncurkan, atau informasi menarik lainnya.
sumber
CFBundleShortVersionString
danCFBundleVersion
memiliki nilai yang sama,CFBundleShortVersionString
sebenarnya itulah yang Apple ingin Anda pertimbangkan untuk versi rilis Anda , yang akan menjadi apa yang Anda tunjukkan kepada pengguna.CFBundleVersion
berpotensi menjadi nomor versi internal, yang mungkin tidak boleh Anda tampilkan kepada pengguna (jika berbeda).Berdasarkan jawaban @ Quinn, di sini proses lengkap dan kode kerja yang saya gunakan untuk melakukan ini.
Gantilah isinya dengan:
<?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>
Buat fase build Run Script , pindah ke setelah fase Copy Bundle Resources . Tambahkan kode ini:
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"
Ganti MyAppName dengan nama aplikasi Anda yang sebenarnya, dan 1 setelah PreferenceSpecifiers menjadi indeks entri Versi Anda di Pengaturan. Contoh Root.plist di atas ada di indeks 1.
sumber
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"
${INFOPLIST_PATH}
untuk jalur info plistMenggunakan plist Ben Clayton https://stackoverflow.com/a/12842530/338986
Tambahkan
Run script
dengan potongan berikut setelahnyaCopy 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"
Menambahkan
CFBundleVersion
selainCFBundleShortVersionString
. Ini mengeluarkan versi seperti ini:Dengan menulis ke
$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist
alih-alih yang di$SRCROOT
memiliki beberapa manfaat.Settings.bundle
masuk$SRCROOT
. Jalannya mungkin berbeda-beda.Pengujian pada Xcode 7.3.1
sumber
Berdasarkan contoh di sini , berikut skrip yang saya gunakan untuk memperbarui nomor versi bundel pengaturan secara otomatis:
#! /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)
Inilah Root.plist yang saya miliki di 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>
sumber
NSDictionary
(dan tidak menyadarinya juga memberi Anda akses mudah ke file plist)gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
Jawaban lain tidak berfungsi dengan benar karena satu alasan: Fase pembuatan skrip jalankan tidak dijalankan hingga SETELAH Bundel Pengaturan telah dikemas. Jadi, jika versi Info.plist Anda adalah 2.0.11 dan Anda memperbaruinya menjadi 2.0.12, lalu buat / arsipkan proyek Anda, paket Pengaturan akan tetap bertuliskan 2.0.11. Jika Anda membuka bundel Pengaturan Root.plist, Anda dapat melihat bahwa nomor versi tidak diperbarui hingga AKHIR proses pembuatan. Anda dapat membangun proyek LAGI untuk memperbarui paket Pengaturan dengan benar, atau Anda dapat menambahkan skrip ke fase pra-pembuatan sebagai gantinya ...
Tambahkan skrip Anda ke area teks. Skrip berikut berhasil untuk saya. Anda mungkin perlu mengubah jalur agar sesuai dengan penyiapan proyek Anda:
versionString = $ (/ usr / libexec / PlistBuddy -c "Cetak CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")
/ usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"
Ini akan menjalankan skrip dengan benar SEBELUM paket Pengaturan dikemas selama proses pembuatan / pengarsipan. Jika Anda membuka bundel Pengaturan Root.plist dan membangun / mengarsipkan proyek Anda, Anda sekarang akan melihat nomor versi diperbarui pada awal proses pembuatan dan bundel Pengaturan Anda akan menampilkan versi yang benar.
sumber
Dengan Xcode 11.4, Anda dapat menggunakan langkah-langkah berikut untuk menampilkan versi aplikasi di bundel pengaturan aplikasi Anda.
Set
$(MARKETING_VERSION)
dan$(CURRENT_PROJECT_VERSION)
variabelCatatan: jika
$(MARKETING_VERSION)
dan$(CURRENT_PROJECT_VERSION)
variabel muncul untuk tombolBundle version string (short)
danBundle version
di Info.plist , Anda dapat melewati langkah-langkah berikut dan beralih ke bagian berikutnya.0.1.0
) Dan ubah konten bidang Bangun ke beberapa nilai baru (mis12
.). 2 perubahan ini akan membuat$(MARKETING_VERSION)
dan$(CURRENT_PROJECT_VERSION)
variabel di file Info.plist .Buat dan konfigurasikan Bundel Pengaturan
<?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>
Tambahkan Run Script
version="$MARKETING_VERSION" build="$CURRENT_PROJECT_VERSION" /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
Luncurkan aplikasi
Sumber
sumber
Set: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
($build)
Saya berhasil melakukan apa yang saya inginkan dengan menggunakan porject sumber terbuka pListcompiler ( http://sourceforge.net/projects/plistcompiler ).
Menggunakan kompiler ini Anda dapat menulis file properti dalam file .plc menggunakan format berikut:
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 ] } ] } }
Saya memiliki fase pembuatan skrip run kustom yang mengekstrak revisi repositori saya ke file .h seperti yang dijelaskan oleh brad-larson di sini .
File plc dapat berisi arahan preprocessor, seperti #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode environment variable. Jadi saya bisa mereferensikan variabel kRevisionNumber dengan menambahkan direktif berikut
#include "Revision.h"
Saya juga menambahkan fase pembuatan skrip khusus ke target xcode saya untuk menjalankan plcompiler setiap kali proyek sedang dibangun
/usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
Dan itu dia!
sumber
Contoh kerja saya berdasarkan jawaban @Ben Clayton dan komentar @Luis Ascorbe dan @Vahid Amiri:
Tambahkan paket pengaturan ke root proyek Anda. Jangan ganti namanya
Buka Settings.bundle / Root.plist sebagai SourceCode
Gantilah isinya dengan:
<?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>
Tambahkan skrip berikut ke Build, bagian Pra-tindakan dari skema proyek (target)
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"
Bangun dan Jalankan skema saat ini
sumber
Jawaban di atas tidak berfungsi untuk saya, maka saya membuat skrip kustom saya.
Ini secara dinamis memperbarui entri dari Root.plist
Gunakan run script di bawah ini. Akan bekerja dengan pasti diverifikasi dalam xcode 10.3.
"var buildVersion" adalah versi yang akan ditampilkan dalam judul.
Dan nama pengenalnya adalah "versi var" di bawah untuk judul di settings.bundle 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
Contoh entri di 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>
sumber
Saya yakin Anda dapat melakukan ini menggunakan cara yang mirip dengan yang saya jelaskan dalam jawaban ini (berdasarkan posting ini ).
Pertama, Anda dapat membuat VersionValue sebagai variabel dalam Xcode dengan mengganti namanya menjadi $ {VERSIONVALUE}. Buat file bernama versionvalue.xcconfig dan tambahkan ke proyek Anda. Buka target aplikasi Anda dan buka pengaturan Bangun untuk target itu. Saya yakin Anda perlu menambahkan VERSIONVALUE sebagai pengaturan build yang ditentukan pengguna. Di pojok kanan bawah jendela itu, ubah nilai Berdasarkan ke "versionvalue".
Terakhir, buka target Anda dan buat fase build Run Script. Periksa fase Jalankan Skrip dan tempelkan skrip Anda dalam bidang teks Skrip. Misalnya, skrip saya untuk menandai setelan BUILD_NUMBER saya dengan build Subversion saat ini adalah sebagai berikut:
REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig
Ini harus melakukan trik mengganti variabel ketika nilai-nilai ini berubah dalam proyek Anda.
sumber
Bagi saya ini adalah solusi termudah:
Tambahkan fase pembuatan skrip baru sebelum langkah Salin Sumber Daya Bundel
Kulit:
/usr/bin/env python
Kandungan:
#! /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)
sumber