Como exibir programaticamente o número da versão / versão do destino no aplicativo iOS?

135

Como posso obter programaticamente o valor de target version, como na imagem abaixo?

Como visto na janela Propriedades do destino do meu projeto do Xcode. Quero exibi-lo na tela inicial do meu aplicativo para saber qual versão as pessoas estão usando atualmente?

fino
fonte

Respostas:

392

Existem 2 números!

O número da liberação de marketing é para os clientes, chamado número da versão . Começa com 1.0 e sobe para as principais atualizações para 2.0 , 3.0 , para pequenas atualizações para 1.1 , 1.2 e para as correções para 1.0.1 , 1.0.2 . Esse número é orientado sobre lançamentos e novos recursos. Não precisa parar em 9, 1.11.23 é um número de versão razoável.

O número da compilação é principalmente o número interno de compilações que foram feitas até então. Mas alguns usam outros números, como o número da ramificação do repositório ou seu número de confirmação. Esse número deve ser exclusivo para distinguir as diferentes construções, que possuem apenas pequenas alterações incrementais.


Para obter o número da versão :

Objetivo-C:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Swift <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (testado com 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Para obter o número da compilação :

Objetivo-C:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Swift <3.0:

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Swift 3.0+ (testado até 5.0):

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   

Se você quer os dois em um:

Primeiro use as linhas acima e depois a seguinte.

Objetivo-C:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift (testado até 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Notas:

Os valores no pacote principal nem sempre estão presentes; por exemplo, em um aplicativo de linha de comando, não existe CFBundleShortVersionStringou CFBundleVersion, portanto, os métodos retornamnil e travam porque o código causa um downcast incorreto. Porém, nos aplicativos normais para iOS e Mac da Cocoa, esses valores são definidos e não serão excluídos.

Isso é testado com o Xcode versão 7.3 (7D175) . O número da compilação geralmente é escrito entre parênteses / chaves. O número da compilação está em hexadecimal ou decimal.

buildandversion


No Xcode, você pode incrementar automaticamente o número da compilação como um número decimal , colocando o seguinte na Run scriptfase de compilação nas configurações do projeto

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Para número de compilação hexadecimal, use este script

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Para Xcode fazer o seguinte:

Passo 1

passo 1

Passo 2

passo 2

etapa 3

etapa 3

Binariano
fonte
4
Apenas para adicionar o exemplo acima, "CFBundleVersion" é o Build = 300, "CFBundleShortVersionString" é a versão = 0.41. A resposta de Viktor deve ser a resposta correta.
justinkoh
1
Eu tive problemas com números hexadecimais uma vez. Estados da Apple para usar inteiros: developer.apple.com/library/ios/documentation/general/Reference/...
hashier
Você sabe se existem constantes de seqüência de caracteres para @ "CFBundleShortVersionString" e @ "CFBundleVersion"?
Igrek 15/10/2015
Agora que os sistemas de CI / CD são bastante comuns, você pode apontar as armadilhas do uso de scripts de construção para definir as versões # com elas.
precisa
1
As coisas foram renomeadas para o Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")agora.
Raphael #
13

Você não precisa alterar nada no seu projeto ou no Xcode. Aqui está a versão Swift para os dois separadamente:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Está incluído neste repositório, confira:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
fonte
qual resposta? Eu não vê-lo
Esqarrouth
Existe apenas uma resposta, está em seu segundo parágrafo #
Daniel Galasko 27/11/2015
3
Sim, 1. Há muito barulho e pouco sinal em sua resposta. 2. Isso é rápido, isso é objetivo-c. 3. Isso é da era ios5
Esqarrouth 27/11
As coisas foram renomeadas para o Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")agora.
Raphael #
5

Aqui está o mesmo código para o Swift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
tanaschita
fonte
Bundle.maintinha um vazio infoDictionarypara mim; talvez porque eu esteja fazendo isso de dentro de uma estrutura, não de um executável ou aplicativo? Bundle(for: MyClass.self)contém os valores esperados.
Raphael
4

Exibir programaticamente a versão e o número da versão - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Sandip Patel - SM
fonte
1

Você também pode usar como

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Então você pode usar em qualquer lugar quando declarar Globalmente.

print(appVersion)

Resultado:

Version: #1.0 (#1.0.3)
Sivabalaa Jothibose
fonte
1

Fiz uma extensão para o Bundle, para que seja fácil de usar

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
Amr Angry
fonte