Como obtenho a versão atual do meu projeto iOS no código?


151

Gostaria de obter a versão atual do meu projeto / aplicativo iOS como um NSStringobjeto sem precisar definir uma constante em um arquivo em algum lugar. Não quero alterar meu valor de versão em dois lugares.

O valor precisa ser atualizado quando eu colidir com minha versão no resumo de destino do projeto.

Respostas:


381

Você pode obter a versão e criar números da seguinte maneira:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String

ou no Objective-C

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];

Eu tenho os seguintes métodos em uma categoria em UIApplication:

extension UIApplication {

    static var appVersion: String {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    }

    static var appBuild: String {
        return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
    }

    static var versionBuild: String {
        let version = appVersion, build = appBuild            
        return version == build ? "v\(version)" : "v\(version)(\(build))"
    }
}

Gist: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Aqui está o equivalente em Objective-C:

+ (NSString *) appVersion
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];    
}

+ (NSString *) build
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}

+ (NSString *) versionBuild
{
    NSString * version = [self appVersion];
    NSString * build = [self build];

    NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];

    if (![version isEqualToString: build]) {
        versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
    }

    return versionBuild;
}

Gist: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
Você poderia usar este [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] em vez de [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. ]; Então, agora tornou-se fácil para manter na memória
Durai Amuthan.H

4
@Duraiamuthan eu recomendo usar em (NSString *)kCFBundleVersionKeyvez de @"CFBundleVersion". Embora seja mais longo para digitar (a conclusão automática ajudará aqui), como uma constante é verificada no momento da compilação.
Ashley Mills

Aliás, seria mais preciso ativar essa extensão, em NSBundlevez UIApplicationdisso, também permitirá substituir chamadas estáticas pelas chamadas de instância.
Zapko

@ Zapko - eu discordo respeitosamente. Conceitualmente, isso se encaixa UIApplication, pois as informações retornadas são sobre o aplicativo. Além disso, isso se aplica apenas ao mainpacote configurável - não faria sentido transformar esse método de instância em qualquer pacote configurável.
Ashley Mills

Você quis dizer buildquando disse appBundle(na segunda linha do seu código)?
user1046037

14

Aqui está o que funcionou no Xcode 8, Swift 3:

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

print("Version: \(gAppVersion)")
print("Build: \(gAppBuild)")

3

No objetivo C:

1) Para obter a versão do aplicativo, você deve usar um:

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

2) Para obter a versão Build, você deve usar:

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

1

No Swift, você pode obter a versão do pacote usando:

let info:NSDictionary = NSBundle.mainBundle().infoDictionary!

let version:String = info.objectForKey("CFBundleShortVersionString") as! String

versionLabel.text = "Version:" + version

0

Um projeto meu de código aberto, o App Update Tracker , oferece essa funcionalidade (e mais) na forma de métodos de classe:

  • + (NSString *)getShortVersionString
  • + (NSString *)getLongVersionString

Você usaria assim:

#import "AppUpdateTracker.h"

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);

0

Apenas para nota

Para obter o valor localizado de qualquer chave, você deve usar CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Então, aqui está uma versão Swift para ambos 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


O CFBundleVersionKey não funciona mais no Xcode 8 e no Swift 3. Você conhece a nova chave?
Crashalot

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.