Şimdiye kadar yol
Benim kullanım durumum şuydu:
- Sürümü senkronize ediyorum ve çeşitli hedefler arasında sayılar oluşturuyorum.
- Sürümü senkronize ediyorum ve sayıları hedefin
Settigns.bundle
- Bir CI sunucusundan yapı numarasını okuyup değiştiriyorum.
Nokta 1 ve 2'yi hedef oluşturma komut dosyası ve nokta 3'ü CI üzerinde özel bir komut dosyası olarak yürütürdüm.
Sürümü ve yapıyı Xcode derleme ayarları içinde depolamanın yeni yolu, komut dosyalarını sorunlara neden oluyordu çünkü artık değerleri etkin bir şekilde değiştiremediler. En azından okuma mümkün oldu.
Ne yazık ki Xcode sürümünü saklamak ve proje oluşturma ayarlarına numaraları oluşturmak önleme yasal bir yol bulmak mümkün değildi, ancak ben bir geçici çözüm oluşturmak başardık.
Bir derleme veya arşiv yapıldığında, içinde yazılan değerin Info.plist
kullanıldığı ortaya çıkıyor. Bu, değerin derleme süresi boyunca değiştirildiği anlamına gelir, bu da aynı derleme süresi boyunca değiştirmemize izin vermez.
Ayrıca xcodeproj
cli kullanarak projeyi değiştirmeye çalıştım , ancak projede yapılan herhangi bir değişiklik herhangi bir derlemenin durmasına neden oluyordu, bu yüzden bu çözüm işe yaramadı.
Sonunda, denediğim birçok farklı yaklaşımdan sonra, sonunda Xcode'un yeni davranışını ihlal etmeyen bir uzlaşma bulmayı başardım.
Kısa cevap:
Bir hedef-eylem öncesi gibi, bir komut dosyası için ilgili değerleri yazar hangi yürütülür CFBundleShortVersionString
ve CFBundleVersion
hedef giden tarihiyleInfo.plist
Gerçeğin bir kaynağı olarak, istenen hedefin MARKETING_VERSION
ve değerlerinin değerlerini okumak için Xcode derleme ayarlarını kullanıyorum CURRENT_PROJECT_VERSION
.
Bu şekilde, değerleri proje ayarlarından değiştirdiğinizde - bir sonraki derleme / arşiv üzerine - Info.plist
varolan komut dosyası mantığınız çalışmaya devam ederse, buna yazılır .
Detaylı cevap
Derleme eylemi sırasında bir kaynağı değiştirmenin tek yolu bir pre-action
komut dosyası kullanmaktır . Bir derleme komut dosyasından yapmayı denerseniz - değişiklikler hemen geçerli olmaz ve derleme / arşivin sonunda mevcut olmaz.
Bir derleme öncesi eylem eklemek için - şemayı düzenleme bölümüne gidin.
Ardından Oluştur ve Arşivle bölümlerini genişletin. Altında Pre-action
, Provide build and settings from
açılır menüyü tıklayın ve değerleri okumak istediğiniz doğruluk hedefinin kaynağını seçin.
Aşağıdaki komut dosyasını ekleyin:
# 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
Komut dosyası satırları aşağıdakileri yapar:
- Yürütmek için senkronizasyon komut dosyasının bulunduğu dizine gidin
- Ön eylem sırasında bir günlüğün yazılmasına izin verir, aksi takdirde tüm çıktılar varsayılan olarak susturulur
- Sağlayarak senkronizasyon komut yürütme
MARKETING_VERSION
veCURRENT_PROJECT_VERSION
Son adım, sağlanan değerleri MARKETING_VERSION
ve CURRENT_PROJECT_VERSION
ilgili hedef (ler) i ve istediğiniz zaman okuyan kendi senkronizasyon komut dosyanızı yazmaktır .
Benim durumumda senaryo aşağıdaki gibidir:
#!/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
Ben paylaşılan Info.plist
ve Settings.bundle
her iki uygulama hedefleri arasında kullanın , bu yüzden bu bir kez güncellemek zorunda.
Ayrıca BadgeCounter
, tam olarak aynı sürüme sahip olması ve gömülü olduğu hedef olarak oluşturması gereken bir bildirim hizmeti uzantısı kullanıyorum . Bu yüzden ben de güncelleyin.