Jalan sejauh ini
Kasus penggunaan saya adalah:
- Saya menyinkronkan versi dan membangun angka di beberapa target.
- Saya menyinkronkan versi dan membuat angka dengan target
Settigns.bundle
- Saya membaca dan memodifikasi nomor build dari server CI.
Saya biasa mengeksekusi poin 1 dan 2 sebagai skrip build target dan point 3 sebagai skrip khusus pada CI itu sendiri.
Cara baru menyimpan versi dan membangun dalam pengaturan build Xcode menyebabkan masalah dengan skrip, karena mereka tidak lagi dapat secara efektif mengubah nilai-nilai. Setidaknya membaca adalah mungkin.
Sayangnya saya tidak dapat menemukan cara yang sah untuk mencegah Xcode dari menyimpan versi dan membangun nomor ke pengaturan membangun proyek, namun saya telah berhasil membuat solusi.
Ternyata ketika membangun atau arsip dibuat, nilai yang tertulis dalam Info.plist
digunakan. Ini berarti bahwa nilai tersebut diganti selama waktu pembuatan, yang tidak memungkinkan kami untuk memodifikasinya selama waktu pembuatan yang sama.
Saya juga mencoba memodifikasi proyek menggunakan xcodeproj
cli, namun setiap perubahan pada proyek menyebabkan pembangunan berhenti, jadi solusi ini tidak berfungsi.
Akhirnya, setelah banyak pendekatan berbeda yang saya coba, saya akhirnya berhasil menemukan kompromi yang tidak melanggar perilaku baru Xcode.
Jawaban singkat:
Sebagai tindakan awal sasaran, skrip dijalankan yang menulis nilai masing-masing ke CFBundleShortVersionString
dan CFBundleVersion
ke targetInfo.plist
Sebagai sumber kebenaran, saya menggunakan pengaturan build Xcode untuk membaca nilai MARKETING_VERSION
dan CURRENT_PROJECT_VERSION
target yang diinginkan.
Dengan cara ini, ketika Anda memodifikasi nilai-nilai dari pengaturan proyek - setelah membangun / arsip berikutnya - mereka akan ditulis ke Info.plist
, memungkinkan jika logika skrip yang ada untuk terus bekerja.
Jawaban terperinci
Satu-satunya cara untuk mengubah sumber daya pada tindakan membangun adalah menggunakan pre-action
skrip. Jika Anda mencoba melakukannya dari skrip build - perubahan tidak akan langsung berlaku dan tidak akan ada di akhir build / arsip.
Untuk menambahkan tindakan pra-bangun - buka edit skema.
Kemudian perluas bagian Bangun dan Arsip. Di bawah Pre-action
, klik Provide build and settings from
dropdown dan pilih sumber target kebenaran dari mana Anda ingin membaca nilainya.
Tambahkan skrip berikut:
# 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
Baris skrip melakukan hal berikut:
- Buka direktori tempat skrip sinkronisasi berada untuk menjalankannya
- Mengizinkan log ditulis selama pra-aksi, jika tidak, output apa pun akan dibungkam secara default
- Jalankan skrip sinkronisasi dengan memberikan
MARKETING_VERSION
danCURRENT_PROJECT_VERSION
Langkah terakhir adalah menulis skrip sinkronisasi Anda sendiri yang membaca nilai yang disediakan MARKETING_VERSION
dan CURRENT_PROJECT_VERSION
untuk masing-masing target dan kapan pun Anda inginkan.
Dalam kasus saya, skripnya adalah sebagai berikut:
#!/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
Saya menggunakan shared Info.plist
dan di Settings.bundle
antara kedua target aplikasi saya, jadi saya harus memperbarui ini sekali.
Saya juga menggunakan ekstensi layanan notifikasi BadgeCounter
, yang harus memiliki versi yang sama persis dan membangun sebagai target di mana ia tertanam. Jadi saya memperbarui ini juga.