¿Cómo obtengo la versión actual de mi proyecto iOS en código?


151

Me gustaría poder obtener la versión actual de mi proyecto / aplicación iOS como un NSStringobjeto sin tener que definir una constante en un archivo en alguna parte. No quiero cambiar el valor de mi versión en 2 lugares.

El valor debe actualizarse cuando agrego mi versión en el resumen de destino del proyecto.

Respuestas:


381

Puede obtener la versión y los números de compilación de la siguiente manera:

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

o en Objective-C

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

Tengo los siguientes métodos en una categoría sobre 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


Aquí está el equivalente en 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
Podrías usar este [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] en lugar de [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey] .The Former parece rimar bien con [[NSBundle mainBfoleVersion "Object_IntringFunding". ]; Así que ahora se ha vuelto fácil de recordar
— Durai Amuthan. H

44
@Duraiamuthan recomendaría usar en (NSString *)kCFBundleVersionKeylugar de @"CFBundleVersion". Aunque es más largo de escribir (la función de autocompletar ayudará aquí), ya que es una constante que se verifica en el momento de la compilación.
— Ashley Mills

Por cierto, sería más preciso activar esta extensión en NSBundlelugar de UIApplicationesto también permitirá reemplazar las llamadas estáticas con las instancias.
— Zapko

@Zapko - Estoy respetuosamente en desacuerdo. Conceptualmente esto encaja UIApplication, ya que la información devuelta es sobre la aplicación. Además, esto solo se aplica al mainpaquete: no tendría sentido hacer de este un método de instancia en cualquier paquete.
— Ashley Mills

¿Quiso decir buildcuando dijo appBundle(en la segunda línea de su código)?
— user1046037

14

Esto es lo que funcionó en 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

En el objetivo C:

1) Para obtener la versión de la aplicación, debe utilizar:

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

2) Para obtener la versión Build, debe usar:

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

1

En Swift, puede obtener la versión del paquete usando:

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

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

versionLabel.text = "Version:" + version

0

Un proyecto mío de código abierto, App Update Tracker , ofrece esta funcionalidad (y más) en forma de métodos de clase:

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

Lo usarías así:

#import "AppUpdateTracker.h"

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

0

Solo por nota

Para obtener el valor localizado de cualquier clave, debe usar CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Así que aquí hay una versión Swift para ambos por separado:

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

Está incluido en este repositorio, échale un vistazo:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey ya no funciona en Xcode 8 y Swift 3. ¿Conoces la nueva clave?
— Crashalot

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.