A estrada até agora
Meu caso de uso foi o seguinte:
- Estou sincronizando a versão e construindo números em vários destinos.
- Estou sincronizando a versão e construindo números com o alvo
Settigns.bundle
- Estou lendo e modificando o número da compilação de um servidor de IC.
Eu costumava executar os pontos 1 e 2 como um script de construção de destino e o ponto 3 como um script personalizado no próprio IC.
A nova maneira de armazenar a versão e compilar nas configurações de compilação do Xcode estava causando problemas nos scripts, porque eles não eram mais capazes de modificar efetivamente os valores. Pelo menos a leitura era possível.
Infelizmente, não consegui descobrir uma maneira legítima de impedir o Xcode de armazenar a versão e criar números nas configurações de compilação do projeto, no entanto, consegui criar uma solução alternativa.
Acontece que, quando uma compilação ou arquivamento é feita, o valor escrito em Info.plist
é usado. Isso significa que o valor é substituído durante o tempo de construção, o que não nos permite modificá-lo durante o mesmo tempo de construção.
Também tentei modificar o projeto usando o xcodeproj
cli, no entanto, qualquer alteração no projeto estava causando a interrupção de qualquer compilação, portanto, esta solução não estava funcionando.
Eventualmente, depois de várias abordagens diferentes que tentei, finalmente consegui encontrar um compromisso que não estava violando o novo comportamento do Xcode.
Resposta curta:
Como uma ação prévia do alvo, é executado um script que grava os respectivos valores para CFBundleShortVersionString
e CFBundleVersion
para oInfo.plist
Como fonte da verdade, eu uso as configurações de compilação do Xcode para ler os valores de MARKETING_VERSION
e CURRENT_PROJECT_VERSION
do destino desejado.
Dessa forma, quando você modificar os valores das configurações do projeto - na próxima compilação / arquivamento - eles serão gravados no Info.plist
, permitindo que qualquer uma, se sua lógica de script existente, continue a funcionar.
Resposta detalhada
A única maneira de modificar um recurso em uma ação de construção é usando um pre-action
script. Se você tentar fazer isso a partir de um script de construção - as alterações não entrarão em vigor imediatamente e não estarão presentes no final da construção / arquivamento.
Para adicionar uma ação de pré-construção - vá para o esquema de edição.
Expanda as seções Build e Archive. Em Pre-action
, clique no Provide build and settings from
menu suspenso e selecione a fonte do destino da verdade a partir da qual você deseja ler os valores.
Adicione o seguinte 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
As linhas de script fazem o seguinte:
- Vá para o diretório em que o script de sincronização está localizado para executá-lo
- Permite que um log seja gravado durante a pré-ação, caso contrário, qualquer saída será silenciada por padrão
- Execute o script de sincronização, fornecendo a
MARKETING_VERSION
eCURRENT_PROJECT_VERSION
A etapa final é escrever seu próprio script de sincronização que leia os valores do fornecido MARKETING_VERSION
e CURRENT_PROJECT_VERSION
para o (s) destino (s) respectivo (s) e sempre que desejar.
No meu caso, o script é o seguinte:
#!/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
Eu uso compartilhado Info.plist
e Settings.bundle
entre os dois destinos de aplicativos, por isso preciso atualizá-lo uma vez.
Também uso uma extensão de serviço de notificação BadgeCounter
, que precisa ter exatamente a mesma versão e compilar como o destino no qual está incorporada. Então eu atualizo isso também.