Bagaimana cara menampilkan revisi versi aplikasi dalam bundel pengaturan aplikasi saya?

91

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.

Panagiotis Korros
sumber

Jawaban:

69

Ada solusi lain yang bisa jauh lebih sederhana daripada salah satu jawaban sebelumnya. Apple menggabungkan alat baris perintah yang disebut PlistBuddy di dalam sebagian besar penginstalnya, dan telah memasukkannya ke dalam Leopard di /usr/libexec/PlistBuddy.

Karena Anda ingin mengganti VersionValue, dengan asumsi Anda memiliki nilai versi yang diekstrak $newVersion, Anda dapat menggunakan perintah ini:

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

Tidak perlu mengutak-atik sed atau ekspresi reguler, pendekatan ini cukup mudah. Lihat halaman manual untuk instruksi rinci. Anda dapat menggunakan PlistBuddy untuk menambah, menghapus, atau mengubah entri apa pun dalam daftar properti. Misalnya, teman saya membuat blog tentang menaikkan nomor build di Xcode menggunakan PlistBuddy.

Catatan: Jika Anda hanya menyediakan jalur ke plist, PlistBuddy memasuki mode interaktif, sehingga Anda dapat mengeluarkan beberapa perintah sebelum memutuskan untuk menyimpan perubahan. Saya merekomendasikan melakukan ini sebelum memasukkannya ke dalam skrip build Anda.

Quinn Taylor
sumber
20
Tampaknya saya perlu waktu untuk mencari cara yang benar untuk merujuk ke nomor versi di plist saya; dalam kasus saya ternyata / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - semoga bermanfaat bagi orang lain.
JosephH
Quinn Taylor, JosephH, terima kasih atas jawaban Anda, saya dapat secara otomatis mengimplementasikan nomor versi aplikasi saya di Settings.bundle. +1 untuk Anda berdua ;-)
Niko
7
Dari fase pembuatan "Jalankan Skrip" khusus, saya perlu menyertakan lebih banyak jalur ke Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli
2
Hanya untuk kelengkapan, berikut adalah pendekatan lain dari PListBuddy yang berhasil untuk saya: xcodehelp.blogspot.com/2012/05/…
koen
cara yang paling benar adalah/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala
66

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
9
Ini akan berfungsi kecuali jika pengguna masuk ke Pengaturan sebelum meluncurkan aplikasi Anda.
Moshe
9
@Moshe True, tetapi untuk menangani ini dengan elegan, Anda cukup menentukan Nilai Default dalam file .plist, mungkin sesuatu seperti 'Belum Diluncurkan'
Carlos P
1
meskipun sebagian besar pengembang mungkin menetapkan CFBundleShortVersionStringdan CFBundleVersionmemiliki nilai yang sama, CFBundleShortVersionStringsebenarnya itulah yang Apple ingin Anda pertimbangkan untuk versi rilis Anda , yang akan menjadi apa yang Anda tunjukkan kepada pengguna. CFBundleVersionberpotensi menjadi nomor versi internal, yang mungkin tidak boleh Anda tampilkan kepada pengguna (jika berbeda).
Nate
3
Apakah saya melewatkan sesuatu? Inilah PERSIS yang saya lakukan, tetapi nilainya tidak berubah. Apakah kalian tidak menggunakan properti Judul, yang menurut saya hanya bisa dibaca?
samson
2
Ada juga masalah lain saat memperbarui aplikasi. Paket pengaturan masih akan menampilkan versi build lama hingga aplikasi yang diperbarui diluncurkan setidaknya sekali.
Tanpa kaki
61

Berdasarkan jawaban @ Quinn, di sini proses lengkap dan kode kerja yang saya gunakan untuk melakukan ini.

  • Tambahkan paket pengaturan ke aplikasi Anda. Jangan ganti namanya.
  • Buka Settings.bundle / Root.plist di editor teks

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.

Ben Clayton
sumber
Saya pikir ini adalah cara terbaik untuk pergi
Tony
Saya mencoba ini dan saya melihat nilai Judul berubah dalam paket pengaturan saya. Judul muncul di InAppSettingsKit, tetapi nilainya tidak berubah dari versi awal. Judul tidak pernah muncul di aplikasi Pengaturan. Saya menyerah dan saya hanya akan memunculkan dialog ketika pengguna memilih 'Tentang' di menu '
bugloaf
Saat menggunakan metode ini, pengaturannya tidak hanya baca. yaitu saya dapat memanfaatkan pengaturan nomor versi di settings.app dan itu dapat diedit.
motionpotion
8
Skrip bash @ ben-clayton put tidak berhasil untuk saya, jadi saya membuat ulang berdasarkan jawabannya, ini dia: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"
Luis Ascorbe
1
Anda dapat menggunakan ${INFOPLIST_PATH}untuk jalur info plist
Tomer Even
23

Menggunakan plist Ben Clayton https://stackoverflow.com/a/12842530/338986

Tambahkan Run scriptdengan potongan berikut setelahnya 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"

Menambahkan CFBundleVersionselain CFBundleShortVersionString. Ini mengeluarkan versi seperti ini:

Dengan menulis ke $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist alih-alih yang di $SRCROOTmemiliki beberapa manfaat.

  1. Itu tidak mengubah file dalam copy pekerjaan repositori.
  2. Anda tidak perlu jalur kasus untuk Settings.bundlemasuk $SRCROOT. Jalannya mungkin berbeda-beda.

Pengujian pada Xcode 7.3.1

hiroshi
sumber
1
Ini adalah jawaban IMO terbaik jika Anda menambahkan skrip ke Build, bagian Pra-tindakan dari skema proyek. Lihat jawaban Andy.
Vahid Amiri
2
Ini bekerja untuk saya. Ingatlah untuk mengubah "DefaultValue" menjadi khusus untuk Anda. Misalnya, saya ingin mengubah footer jadi saya menggunakan "FooterText". Anda juga perlu mengubah nomor setelah "PreferenceSpecifiers" agar berkorelasi dengan item di plist.
Richard Witherspoon
12

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>
mrwalker
sumber
Sangat berguna - Saya mengalami masalah saat menjalankan PlistBuddy dari Python, dan saya tidak akan pernah terpikir untuk menggunakannya NSDictionary(dan tidak menyadarinya juga memberi Anda akses mudah ke file plist)
Dov
Terima kasih untuk ini. Satu modifikasi - seperti yang Anda miliki sekarang, itu membuat perubahan ke sumber, bukan builddir - yang berarti bahwa apa yang Anda lihat di perangkat atau di simulator akan selalu menjadi satu versi build di belakang versi build yang sebenarnya. Untuk memperbaikinya, saya memodifikasi skrip Anda untuk melakukan iterasi terlebih dahulu melalui sumbernya, lalu juga builddirnya, yaitu. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod
... dan juga, saya menambahkan githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod
8

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

  • Di XCode, Edit Skema untuk target proyek Anda
  • Klik panah pengungkapan pada skema BUILD
  • Kemudian, klik item "Tindakan sebelumnya"
  • Klik tanda plus dan pilih "New Run Script Action"
  • Setel nilai shell ke / bin / sh
  • Setel "Berikan setelan build dari" ke target proyek Anda
  • 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.

Andy
sumber
Terima kasih, hanya solusi Anda yang menunjukkan versi build yang benar. Solusi lain diperlukan untuk membangun dua kali.
Boris Y.
Ini masih membutuhkan build kedua untuk saya, menggunakan Xcode 10.0
Patrick
@Patrick Aplikasi pengaturan iOS terkadang menyimpan info lama. Untuk melihat perubahannya, Anda harus mematikan dan memulai ulang aplikasi Pengaturan.
Andy
1
BTW, saya telah menemukan cara yang lebih sederhana untuk menambahkan skrip ini: Buka tab Build Phases dari target proyek Anda dan klik ikon "+". Pilih "New Run Script Phase" dan tambahkan kode skrip di sana. INILAH KUNCI: klik dan seret skrip jalankan baru ke bagian atas daftar Fase Build, di bawah Ketergantungan Target, tetapi sebelum Sumber Kompilasi. Ini akan berperilaku sama seperti skrip Pra-bangun dan lebih mudah ditemukan.
Andy
Terima kasih @Andy, solusi Anda untuk menambahkan ke tab Build Phases bekerja dengan sempurna.
Patrick
7

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

Catatan: jika $(MARKETING_VERSION)dan $(CURRENT_PROJECT_VERSION)variabel muncul untuk tombol Bundle version string (short)dan Bundle versiondi Info.plist , Anda dapat melewati langkah-langkah berikut dan beralih ke bagian berikutnya.

  1. Buka proyek Xcode.
  2. Buka Project Navigator ( cmd1), pilih proyek Anda untuk menampilkan pengaturan proyek Anda lalu pilih target aplikasi.
  3. Pilih tab Umum .
  4. Di bagian Identity , ubah konten bidang Versi ke beberapa nilai baru (mis. 0.1.0) Dan ubah konten bidang Bangun ke beberapa nilai baru (mis 12.). 2 perubahan ini akan membuat $(MARKETING_VERSION)dan $(CURRENT_PROJECT_VERSION)variabel di file Info.plist .

Buat dan konfigurasikan Bundel Pengaturan

  1. Di Project Navigator , pilih proyek Anda.
  2. Pilih File > Baru > File… ( cmdN).
  3. Pilih tab iOS .
  4. Pilih Settings Bundle di bagian Resource , lalu klik Next dan Create .
  5. Pilih Root.plist dan buka sebagai kode sumber. Gantilah isinya dengan kode di bawah ini:
<?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

  1. Di Project Navigator , pilih proyek Anda.
  2. Pilih target aplikasi.
  3. Pilih tab Build Phases .
  4. Klik + > New Run Script Phase .
  5. Seret dan lepas fase baru di suatu tempat di atas bagian Salin Sumber Daya Bundel . Dengan cara ini, skrip akan dijalankan sebelum menyusun aplikasi.
  6. Buka fase Run Script yang baru ditambahkan dan tambahkan skrip berikut:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Luncurkan aplikasi

  1. Jalankan produk ( cmdR) di perangkat atau simulator.
  2. Di perangkat atau simulator, setelah aplikasi diluncurkan, buka aplikasi Pengaturan dan pilih aplikasi Anda di daftar aplikasi pihak ketiga. Versi aplikasi harus ditampilkan seperti yang ditunjukkan di bawah ini:


Sumber

Imanou Petit
sumber
Ini melempar kesalahan bagi sayaSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H
2
Ini berhasil bagi saya:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H
Terima kasih. Ini dunia apa bagiku. Tapi milikku bernama Settings-Watch.bundle dan menghapus($build)
Kurt Lane
3

Saya berhasil melakukan apa yang saya inginkan dengan menggunakan porject sumber terbuka pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. 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
                    ]
                }
            ]
        }
    }
    
  2. Saya memiliki fase pembuatan skrip run kustom yang mengekstrak revisi repositori saya ke file .h seperti yang dijelaskan oleh brad-larson di sini .

  3. 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"
    
  4. 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!

Panagiotis Korros
sumber
Kedengarannya seperti banyak pekerjaan hanya untuk mengganti satu nilai dalam file plist ... Secara konseptual keren untuk dapat mengakses variabel saat membuat plist, tetapi jauh lebih mudah menggunakan tool build untuk file plist. Saya menggambarkan PlistBuddy dalam jawaban saya - cobalah!
Quinn Taylor
3

Contoh kerja saya berdasarkan jawaban @Ben Clayton dan komentar @Luis Ascorbe dan @Vahid Amiri:

Catatan: Pendekatan ini mengubah file Settings.bundle / Root.plist dalam copy pekerjaan repositori

  1. Tambahkan paket pengaturan ke root proyek Anda. Jangan ganti namanya

  2. 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>
    
  3. 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"
    
  4. Bangun dan Jalankan skema saat ini

Peter Kreinz
sumber
2

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>

Contoh kerja entri Root.plist

dheeraj_jha
sumber
1

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.

Brad Larson
sumber
Ini berfungsi jika saya ingin memasukkan nomor versi ke dalam file Info.plist. Tetapi saya tidak dapat membuatnya berfungsi untuk file plist lain misalnya file Root.plist yang terletak di Settings.bundle. Apakah ada pengaturan build yang dapat saya gunakan untuk mengaktifkan ini?
Panagiotis Korros
0

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)
gklka.dll
sumber