La strada finora
Il mio caso d'uso è stato quello:
- Sto sincronizzando la versione e costruisco numeri attraverso diversi target.
- Sto sincronizzando la versione e costruendo i numeri con quelli del target
Settigns.bundle
- Sto leggendo e modificando il numero di build da un server CI.
In passato eseguivo i punti 1 e 2 come script di build di destinazione e il punto 3 come script personalizzato sull'elemento della configurazione stesso.
Il nuovo modo di archiviare la versione e la compilazione nelle impostazioni di compilazione di Xcode causava problemi con gli script, poiché non erano più in grado di modificare efficacemente i valori. Almeno la lettura era possibile.
Sfortunatamente non sono stato in grado di scoprire un modo legittimo per impedire a Xcode di archiviare la versione e creare numeri nelle impostazioni di creazione del progetto, tuttavia sono riuscito a creare una soluzione alternativa.
Si scopre che quando viene creata una build o un archivio, viene utilizzato il valore scritto in Info.plist
. Ciò significa che il valore viene sostituito durante il tempo di compilazione, il che non ci consente di modificarlo durante lo stesso tempo di compilazione.
Ho anche provato a modificare il progetto usando xcodeproj
cli, tuttavia qualsiasi modifica al progetto stava causando l'arresto di qualsiasi build, quindi questa soluzione non funzionava.
Alla fine, dopo molti approcci diversi che ho provato, sono finalmente riuscito a trovare un compromesso che non stava violando il nuovo comportamento dell'Xcode.
Risposta breve:
Come pre-azione del bersaglio, viene eseguito uno script che scrive i rispettivi valori su CFBundleShortVersionString
e CFBundleVersion
sul bersaglioInfo.plist
Come fonte di verità, utilizzo le impostazioni di build di Xcode per leggere i valori di MARKETING_VERSION
e CURRENT_PROJECT_VERSION
del target desiderato.
In questo modo, quando modifichi i valori dalle impostazioni del progetto - al prossimo build / archivio - verranno scritti in Info.plist
, consentendo a qualsiasi se la tua logica di scripting esistente continui a funzionare.
Risposta dettagliata
L'unico modo per modificare una risorsa su un'azione di compilazione è utilizzare uno pre-action
script. Se provi a farlo da uno script di compilazione, le modifiche non avranno effetto immediato e non saranno presenti alla fine della compilazione / dell'archivio.
Per aggiungere un'azione pre-build, vai a modifica schema.
Quindi espandere le sezioni Build and Archive. Sotto Pre-action
, fai clic sul Provide build and settings from
menu a discesa e seleziona l'origine della verità target da cui desideri leggere i valori.
Aggiungi il seguente script:
# 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
Le linee di script effettuano le seguenti operazioni:
- Vai alla directory in cui si trova lo script di sincronizzazione per eseguirlo
- Consente di scrivere un registro durante l'azione preliminare, altrimenti qualsiasi output viene silenziato per impostazione predefinita
- Eseguire lo script di sincronizzazione fornendo il
MARKETING_VERSION
eCURRENT_PROJECT_VERSION
Il passaggio finale è quello di scrivere il tuo script di sincronizzazione che legge i valori del fornito MARKETING_VERSION
e CURRENT_PROJECT_VERSION
dei rispettivi target e quando lo desideri.
Nel mio caso lo script è il seguente:
#!/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
Uso condiviso Info.plist
e Settings.bundle
tra entrambi i target delle mie app, quindi devo aggiornarlo una volta.
Inoltre, utilizzo un'estensione del servizio di notifica BadgeCounter
, che deve avere la stessa versione esatta e compilare come destinazione in cui è incorporato. Quindi aggiorno anche questo.