Como posso exibir a revisão da versão do aplicativo no pacote de configurações do meu aplicativo?

89

Eu gostaria de incluir a versão do aplicativo e a revisão interna, algo como 1.0.1 (r1243), no pacote de configurações do meu aplicativo.

O arquivo Root.plist contém um fragmento como este ...

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

e eu gostaria de substituir a string "VersionValue" no momento da criação.

Eu tenho um script que pode extrair o número da versão do meu repositório, o que eu preciso é uma maneira de processar (pré-processar) o arquivo Root.plist, em tempo de construção, e substituir o número da revisão sem afetar o arquivo fonte.

Panagiotis Korros
fonte

Respostas:

69

Existe outra solução que pode ser muito mais simples do que qualquer uma das respostas anteriores. A Apple empacota uma ferramenta de linha de comando chamada PlistBuddy dentro da maioria de seus instaladores e a incluiu no Leopard em /usr/libexec/PlistBuddy.

Como deseja substituir VersionValue, supondo que o valor da versão seja extraído para $newVersion, você pode usar este comando:

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

Não há necessidade de mexer com sed ou expressões regulares, essa abordagem é bastante direta. Consulte a página do manual para obter instruções detalhadas. Você pode usar o PlistBuddy para adicionar, remover ou modificar qualquer entrada em uma lista de propriedades. Por exemplo, um amigo meu escreveu em um blog sobre como aumentar os números de construção no Xcode usando PlistBuddy.

Observação: se você fornecer apenas o caminho para o plist, o PlistBuddy entrará no modo interativo, para que você possa emitir vários comandos antes de decidir salvar as alterações. Definitivamente, recomendo fazer isso antes de colocá-lo em seu script de construção.

Quinn Taylor
fonte
20
Demorou um pouco para descobrir a maneira correta de se referir ao número da versão em meu plist; no meu caso acabou sendo / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - espero que seja útil para outras pessoas.
JosephH
Quinn Taylor, JosephH, graças às suas respostas, fui capaz de implementar automaticamente o número da versão do meu aplicativo no Settings.bundle. +1 para vocês dois ;-)
Niko,
7
A partir de uma fase de compilação "Run Script" personalizada, precisei incluir mais do caminho para Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli,
2
Apenas para completar, aqui está outra abordagem com o PListBuddy que funcionou para mim: xcodehelp.blogspot.com/2012/05/…
koen
a maneira mais correta é/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala
66

A solução do meu preguiçoso foi atualizar o número da versão do código do meu aplicativo. Você pode ter um valor padrão (ou em branco) em Root.plist e, em seguida, em algum lugar em seu código de inicialização:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];

O único problema é que seu aplicativo teria que ser executado pelo menos uma vez para que a versão atualizada apareça no painel de configurações.

Você pode levar a ideia adiante e atualizar, por exemplo, um contador de quantas vezes seu aplicativo foi iniciado ou outras informações interessantes.


fonte
9
Isso funcionará, exceto se o usuário entrar em Configurações antes de iniciar o aplicativo.
Moshe
9
@Moshe True, mas para lidar com isso com elegância, você pode simplesmente especificar um valor padrão dentro do arquivo .plist, talvez algo como 'Ainda não lançado'
Carlos P
1
embora a maioria dos desenvolvedores provavelmente defina CFBundleShortVersionStringe CFBundleVersioncom o mesmo valor, CFBundleShortVersionStringé realmente o que a Apple quer que você considere sua versão lançada , que seria o que você mostraria aos usuários. CFBundleVersionpode ser potencialmente um número de versão interno, que você provavelmente não deve mostrar aos usuários (se for diferente).
Nate
3
Estou esquecendo de algo? Isso é EXATAMENTE o que estou fazendo, mas o valor não muda. Vocês não estão usando uma propriedade Title, que acredito ser somente leitura?
samson
2
Também há outro problema ao atualizar o aplicativo. O pacote configurável ainda exibiria a versão de compilação antiga até que o aplicativo atualizado seja iniciado pelo menos uma vez.
Legoless
60

Com base na resposta de @Quinn, aqui está o processo completo e o código de trabalho que uso para fazer isso.

  • Adicione um pacote de configurações ao seu aplicativo. Não o renomeie.
  • Abra Settings.bundle / Root.plist em um editor de texto

Substitua o conteúdo por:

<?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>
  • Crie uma fase de construção Run Script , para depois da fase Copy Bundle Resources . Adicione este código:

    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"
  • Substitua MyAppName pelo nome real do seu aplicativo e o 1 após PreferenceSpecifiers para ser o índice da sua entrada de versão nas configurações. O exemplo Root.plist acima está no índice 1.

Ben Clayton
fonte
Acho que este é o melhor caminho a percorrer
Tony
Eu tentei isso e vejo o valor do título mudando em meu pacote de configurações. O título aparece no InAppSettingsKit, mas o valor não muda da versão inicial. O título nunca aparece no aplicativo Configurações. Estou desistindo e irei abrir uma caixa de diálogo quando o usuário selecionar 'Sobre' em um menu '
bugloaf
Ao usar este método, a configuração não é somente leitura. ou seja, posso tocar na configuração do número da versão em settings.app e é editável.
motionpotion
8
O script bash @ ben-clayton put não funcionou para mim, então eu o refaço com base na resposta dele, aqui está: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
você pode usar ${INFOPLIST_PATH}para o caminho de plist de informações
Tomer Even
23

Usando o plist de Ben Clayton https://stackoverflow.com/a/12842530/338986

Adicione Run scriptcom o seguinte trecho depois 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"

Anexando CFBundleVersionalém de CFBundleShortVersionString. Ele emite uma versão como esta:

Ao escrever para em $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist vez de $SRCROOTter alguns benefícios.

  1. Ele não modifica arquivos na cópia de trabalho do repositório.
  2. Você não precisa definir o caminho para Settings.bundledentro $SRCROOT. O caminho pode variar.

Testando no Xcode 7.3.1

Hiroshi
fonte
1
Esta é a melhor resposta IMO se você adicionar o script à seção Build, Pre-actions do esquema do projeto. Veja a resposta de Andy.
Vahid Amiri
2
Isso está funcionando para mim. Apenas lembre-se de alterar "DefaultValue" para ser específico para você. Por exemplo, eu queria mudar o rodapé, então usei "FooterText". Você também precisa alterar o número após "PreferenceSpecifiers" para que ele se correlacione com o item no plist.
Richard Witherspoon
12

Com base no exemplo aqui , aqui está o script que estou usando para atualizar automaticamente o número da versão do pacote de configurações:

#! /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)

Aqui está o Root.plist que tenho em 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
fonte
Muito útil - estou tendo problemas para executar o PlistBuddy em Python e nunca teria pensado em usá-lo NSDictionary(e também não sabia que isso proporcionava um acesso tão fácil aos arquivos plist)
Dov
Obrigado por isso. Uma modificação - como você a tem agora, faz uma alteração na fonte, não no builddir - o que significa que o que você vê em seu dispositivo ou no simulador sempre será uma versão de compilação atrás da versão de compilação real. Para corrigir isso, modifiquei seu script para iterar primeiro no código-fonte e, em seguida, também no builddir, ou seja, settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod
... e também, acrescento o githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod
8

As outras respostas não funcionam corretamente por um motivo: a fase de construção do script de execução não é executada até APÓS o pacote de configurações ter sido empacotado. Portanto, se sua versão do Info.plist for 2.0.11 e você atualizá-lo para 2.0.12 e, em seguida, construir / arquivar seu projeto, o pacote Configurações ainda exibirá 2.0.11. Se você abrir o pacote Root.plist de configurações, poderá ver que o número da versão não é atualizado até o FIM do processo de construção. Você pode construir o projeto NOVAMENTE para que o pacote de configurações seja atualizado corretamente ou pode adicionar o script a uma fase de pré-construção ...

  • No XCode, edite o esquema para o destino do seu projeto
  • Clique na seta de divulgação no esquema BUILD
  • Em seguida, clique no item "Pré-ações"
  • Clique no sinal de mais e escolha "Nova ação de script de execução"
  • Defina o valor do shell para / bin / sh
  • Defina "Fornecer configurações de construção de" para o destino do projeto
  • Adicione seu script à área de texto. O seguinte script funcionou para mim. Pode ser necessário modificar os caminhos para corresponder à configuração do projeto:

    versionString = $ (/ usr / libexec / PlistBuddy -c "Imprimir CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"

Isso executará corretamente o script ANTES do pacote de configurações ser empacotado durante o processo de construção / arquivamento. Se você abrir o pacote Root.plist de configurações e construir / arquivar seu projeto, verá que o número da versão é atualizado no início do processo de construção e o pacote de configurações exibirá a versão correta.

Andy
fonte
Obrigado, apenas sua solução mostra a versão de compilação correta. Outras soluções necessárias para construir duas vezes.
Boris Y.
Isso ainda exigia uma segunda construção para mim, usando o Xcode 10.0
Patrick,
@Patrick O aplicativo de configurações do iOS às vezes retém informações antigas. Para ver a mudança, você deve encerrar e reiniciar o aplicativo Configurações.
Andy
1
BTW, descobri uma maneira mais simples de adicionar este script: Vá para a guia Build Phases do destino do projeto e clique no ícone "+". Escolha "New Run Script Phase" e adicione o código do script lá. ESTA É A CHAVE: clique e arraste o novo script de execução para o topo da lista Build Phases, em Target Dependencies, mas antes de Compile Sources. Ele se comportará da mesma forma que um script de pré-criação e é mais fácil de encontrar.
Andy
Obrigado @Andy, sua solução de adicionar à guia Fases de construção funcionou perfeitamente.
Patrick,
6

Com o Xcode 11.4, você pode usar as etapas a seguir para exibir a versão do aplicativo no pacote de configurações do seu aplicativo.


Conjunto $(MARKETING_VERSION)e $(CURRENT_PROJECT_VERSION)variáveis

Observação: se as variáveis $(MARKETING_VERSION)e $(CURRENT_PROJECT_VERSION)aparecem para as chaves Bundle version string (short)e Bundle versionem Info.plist , você pode pular as etapas a seguir e pular para a próxima seção.

  1. Abra o projeto Xcode.
  2. Abra o Project Navigator ( cmd1), selecione seu projeto para revelar suas configurações e selecione o destino do aplicativo.
  3. Selecione a guia Geral .
  4. Na seção Identidade , altere o conteúdo do campo Versão para algum novo valor (por exemplo 0.1.0) e altere o conteúdo do campo Build para algum novo valor (por exemplo 12). Estes 2 mudanças vão criar $(MARKETING_VERSION)e $(CURRENT_PROJECT_VERSION)variáveis em Info.plist arquivo.

Criar e configurar o pacote de configurações

  1. No Project Navigator , selecione seu projeto.
  2. Selecione Arquivo > Novo > Arquivo… ( cmdN).
  3. Selecione a guia iOS .
  4. Selecione Pacote de configurações na seção Recursos , clique em Avançar e em Criar .
  5. Selecione Root.plist e abra-o como código-fonte. Substitua seu conteúdo pelo código abaixo:
<?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>

Adicionar um script de execução

  1. No Project Navigator , selecione seu projeto.
  2. Selecione o destino do aplicativo.
  3. Selecione a guia Fases de construção .
  4. Clique em + > Nova fase de execução de script .
  5. Arraste e solte a nova fase em algum lugar acima da seção Copiar recursos do pacote . Desta forma, o script será executado antes de compilar a aplicação.
  6. Abra a fase Run Script recém-adicionada e adicione o seguinte script:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Lançamento do Aplicativo

  1. Execute o produto ( cmdR) no dispositivo ou simulador.
  2. No dispositivo ou simulador, assim que o aplicativo for iniciado, abra o aplicativo Configurações e selecione seu aplicativo na lista de aplicativos de terceiros. A versão do aplicativo deve ser exibida conforme mostrado abaixo:


Fontes

Imanou Petit
fonte
Isso lança um erro para mimSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H
2
Isso funcionou para mim:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H
Obrigado. Este que mundo para mim. Mas o meu foi nomeado Settings-Watch.bundle e removeu o($build)
Kurt Lane
3

Consegui fazer o que queria usando o objeto de código aberto pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. Usando este compilador, você pode gravar o arquivo de propriedades em um arquivo .plc usando o seguinte formato:

    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. Tive uma fase de construção de script de execução personalizada que estava extraindo minha revisão de repositório para o arquivo .h, conforme descrito por brad-larson aqui .

  3. O arquivo plc pode conter diretivas de pré-processador, como #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, variáveis ​​de ambiente xcode. Pude fazer referência à variável kRevisionNumber adicionando a seguinte diretiva

    #include "Revision.h"
  4. Eu também adicionei uma fase de construção de script personalizado ao meu destino xcode para executar o plcompiler toda vez que o projeto estiver sendo construído

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc

E foi isso!

Panagiotis Korros
fonte
Parece muito trabalhoso apenas substituir um único valor em um arquivo plist ... É conceitualmente legal poder acessar uma variável ao construir um plist, mas é muito mais fácil usar uma ferramenta de construção para um arquivo plist. Eu descrevo o PlistBuddy em minha resposta - experimente!
Quinn Taylor
3

Meu exemplo de trabalho baseado na resposta de @Ben Clayton e nos comentários de @Luis Ascorbe e @Vahid Amiri:

Nota: Esta abordagem modifica o arquivo Settings.bundle / Root.plist na cópia de trabalho do repositório

  1. Adicione um pacote de configurações à raiz do projeto. Não mude o nome

  2. Abra Settings.bundle / Root.plist como SourceCode

    Substitua o conteúdo por:

    <?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. Adicione o seguinte script à seção Construir, Pré-ações do esquema do projeto (destino)

    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. Construir e executar o esquema atual

Peter Kreinz
fonte
2

As respostas acima não funcionaram para mim, portanto, criei meu script personalizado.

Isso atualiza dinamicamente a entrada de Root.plist

Use o script de execução abaixo. Irá funcionar com certeza verificado no xcode 10.3.

"var buildVersion" é a versão a ser exibida no título.

E o nome do identificador é "var version" abaixo para o título em 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

Exemplo de entrada em 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>

Exemplo de trabalho de entrada Root.plist

dheeraj_jha
fonte
1

Acredito que você possa fazer isso de uma forma semelhante à que descrevo nesta resposta (com base nesta postagem ).

Primeiro, você pode tornar VersionValue uma variável dentro do Xcode renomeando-o para $ {VERSIONVALUE}. Crie um arquivo chamado versionvalue.xcconfig e adicione-o ao seu projeto. Vá para o destino do seu aplicativo e vá para as configurações de Build para esse destino. Eu acredito que você precisa adicionar VERSIONVALUE como uma configuração de compilação definida pelo usuário. No canto inferior direito da janela, altere o valor Baseado em para "versionvalue".

Por fim, vá para o seu destino e crie uma fase de construção Executar Script. Inspecione essa fase Run Script e cole no seu script dentro do campo de texto Script. Por exemplo, meu script para marcar minha configuração BUILD_NUMBER com a compilação atual do Subversion é o seguinte:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

Isso deve fazer o truque de substituir a variável quando esses valores mudam em seu projeto.

Brad Larson
fonte
Isso funciona se eu quiser incorporar o número da versão ao arquivo Info.plist. Mas não consigo fazer funcionar com outros arquivos plist, por exemplo, o arquivo Root.plist que está localizado em Settings.bundle. Existe uma configuração de compilação que posso usar para habilitar isso?
Panagiotis Korros
0

Para mim, esta foi a solução mais fácil:

Adicione uma nova fase de construção de script antes da etapa Copiar recursos de pacote

Concha: /usr/bin/env python

Conteúdo:

#! /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
fonte