¿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.