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.

Jovan
fonte

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

Ashley Mills
fonte
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)")
Crashalot
fonte
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"]; 
Vaibhav Shiledar
fonte
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
Ravindra Kishan
fonte
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]);
Stunner
fonte
0

Apenas para nota

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

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

Esqarrouth
fonte
O CFBundleVersionKey não funciona mais no Xcode 8 e no Swift 3. Você conhece a nova chave?
Crashalot
Aqui está um atualizado: github.com/goktugyil/EZSwiftExtensions/blob/…
### Esqarrouth