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

Jovan
fuente

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

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

Solo por nota

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

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

Esqarrouth
fuente
CFBundleVersionKey ya no funciona en Xcode 8 y Swift 3. ¿Conoces la nueva clave?
Crashalot
Aquí hay uno actualizado: github.com/goktugyil/EZSwiftExtensions/blob/…
Esqarrouth