Como meu aplicativo para iPhone pode detectar seu próprio número de versão?

254

Estou escrevendo um aplicativo para iPhone. Já foi publicado, mas eu gostaria de adicionar um recurso em que o número da versão é exibido.

Prefiro não ter que fazer isso manualmente com cada versão lançada ...

Existe uma maneira no objetivo-C de descobrir qual é a versão do meu aplicativo?

Brad Larson
fonte
1
Esta pergunta já foi respondida aqui stackoverflow.com/a/16888788/2890157 .
Akshat Singhal
1
.. a pergunta vinculada é de 4 anos depois, então a verdadeira questão aqui é que o cmos nunca aceitou uma resposta. Independentemente disso, as respostas da pergunta vinculada são úteis, assim como as respostas aqui. Nos dois segmentos, veja além da primeira resposta - às vezes há mais informações atualizadas em uma resposta posterior.
Página

Respostas:

222

Como descrevo aqui , uso um script para reescrever um arquivo de cabeçalho com o meu número de revisão atual do Subversion. Esse número de revisão é armazenado na constante kRevisionNumber. Posso acessar o número da versão e da revisão usando algo semelhante ao seguinte:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

que criará uma sequência do formato "Versão 1.0 (51)".

Brad Larson
fonte
152
Isso retornou minha versão de compilação, então eu usei essa. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner
6
CFBundleVersion está incorreto, porque o Xcode preenche erroneamente essa entrada com o número da compilação e não o número da versão. jspooner está correto.
Oscar
4
Consulte stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 para obter uma excelente explicação dos números de versão versus compilação. Confirma o CFBundleShortVersionStringque você normalmente deseja para 'version' e CFBundleVersionpara o número da versão .
Rory
3
O kRevisionNumber parece não funcionar para mim. Para obter a saída especificada eu fiz (correção usando @jspooner 's) seguinte:[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam
147

Com base na resposta de Brad Larson, se você tiver informações de versão principais e secundárias armazenadas no repositório de informações (como eu fiz em um projeto específico), isso funcionou bem para mim:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Agora, a atualização manual de uma versão menor pode ser uma chatice, portanto, o ideal é usar um truque de número de revisão do repositório de origem. Se você não o vinculou (como eu não fiz), o snippet acima pode ser útil. Ele também pega o nome de exibição do aplicativo.

idStar
fonte
59

Versão Swift para ambos separadamente:

Swift 3

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

Swift 2

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
42

Foi isso que fiz na minha inscrição

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Espero que esta resposta simples ajude alguém ...

Arkady
fonte
1
Para minhas necessidades, isso é ótimo. Obrigado. 1
David DelMonte
1
Este retornar o nome de construção, não a versão
chancyWu
@chancyWu, CFBundleShortVersionString parece fornecer a versão.
precisa saber é o seguinte
31

Você pode especificar a CFBundleShortVersionStringsequência em seu plist.info e ler isso programaticamente usando a API fornecida .

Jasper Bekkers
fonte
30

Há duas coisas - versão de compilação e versão do aplicativo.

  1. Para obter a versão do aplicativo:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Para obter a versão Build:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Shaik Riyaz
fonte
Existe alguma diferença entre esses dois? Ambos retornam o mesmo para mim.
jjnevis
Sim, pode ser que o número da sua versão e a versão do aplicativo sejam iguais nas configurações.
Shaik Riyaz
Ok, só tenho uma configuração no meu RAKEFILE - app.version (estou usando RubyMotion). Eu acho que qualquer um servirá para minhas necessidades. Graças
jjnevis
Obrigado, companheiro. Funcionou sem problemas.
Felipe
1
FYI É preferível usar em objectForInfoDictionaryKey:vez de infoDictionary] objectForKey:porque o primeiro retorna o valor localizado (se houver). Provavelmente não vai fazer a diferença aqui embora;)
deanWombourne
17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
John Erck
fonte
1
Exatamente o que eu precisava!
Julius
16

Uma maneira sucinta de obter uma string de versão no formato XYZ é:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Ou, apenas por XY:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

Ambos os trechos retornam strings que você atribuiria à propriedade de texto do objeto Label, por exemplo

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
rodamn
fonte
7

Você pode tentar usar o dicionário como: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Abhishek Verma
fonte
4

Leia o arquivo info.plist do seu aplicativo e obtenha o valor da chave CFBundleShortVersionString. A leitura de info.plist fornecerá um objeto NSDictionary

lostInTransit
fonte
4

Você pode usar o infoDictionary que obtém os detalhes da versão em info.plist do seu aplicativo. Esse código funciona para o swift 3. Basta chamar esse método e exibir a versão em qualquer elemento preferido da interface do usuário.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}
rajat chauhan
fonte
3

Swift 5:

Há duas coisas - versão do aplicativo e versão do build

  • Para obter a versão do aplicativo:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Para obter a versão Build:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Graças @Brad Larson♦muito a

dengST30
fonte
1

Se você precisar de uma combinação de versão e número de compilação , aqui está uma pequena maneira de usar o Swift 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Adicione um as! Stringao final da linha appVersionou buildNumpara obter apenas essa parte como um Stringobjeto. Não há necessidade disso, se você estiver procurando o máximo versionInfo.

Eu espero que isso ajude!

Jeehut
fonte
1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Com base em @rajat chauhan, resposta sem elenco forçado a String.

apex39
fonte
0

É uma boa coisa para lidar com um sistema de controle de revisão. Dessa forma, quando você recebe um relatório de bug de um usuário, pode verificar essa revisão de código e (espero) reproduzir o bug executando exatamente o mesmo código que o usuário.

A idéia é que toda vez que você fizer uma compilação, você executará um script que obtém o número de revisão atual do seu código e atualiza um arquivo dentro do seu projeto (geralmente com alguma forma de substituição de token). Em seguida, você pode escrever uma rotina de tratamento de erros que sempre inclua o número da revisão na saída do erro ou exibi-lo em uma página "Sobre".

RedFilter
fonte
0

Você pode tentar este método:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
BatyrCan
fonte