2011-09-30 18 views
125

Me gustaría poder obtener la versión actual de mi proyecto/aplicación de iOS como un objeto NSString sin tener que definir una constante en un archivo en alguna parte. No quiero cambiar el valor de mi versión en 2 lugares.¿Cómo obtengo la versión actual de mi proyecto iOS en código?

El valor debe actualizarse cuando encuentre mi versión en el resumen del objetivo del proyecto.

Respuesta

330

Puede obtener la versión y el número 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 métodos siguientes en una categoría en UIApplication:

extension UIApplication { 

    class func appVersion() -> String { 
     return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String 
    } 

    class func appBuild() -> String { 
     return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String 
    } 

    class func versionBuild() -> String { 
     let version = appVersion(), build = appBuild() 

     return version == build ? "v\(version)" : "v\(version)(\(build))" 
    } 
} 

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


Aquí es 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; 
} 

Síntesis:https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd

+1

podría utilizar este [ [NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] en lugar de [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey].El anterior parece rimar bien con [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"]; así que ahora es fácil mantenerlo en la memoria –

+4

@Duraiamuthan. Yo recomendaría usar '(NSString *) kCFBundleVersionKey' en lugar de' @ "CFBundleVersion" '. Aunque es más largo escribir (completar automáticamente ayudará aquí), ya que es una constante que se comprueba en tiempo de compilación. –

+0

Por cierto, sería más preciso hacer esta extensión en 'NSBundle' en lugar de' UIApplication' esto también permitirá reemplazar las llamadas estáticas con las de instancia. – Zapko

2

En Swift, se puede obtener la versión del paquete mediante el uso de:

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

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

versionLabel.text = "Version:" + version 
1

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

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

Usted podría usarlo de esta manera:

#import "AppUpdateTracker.h" 

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

Así que aquí hay un Swift versión para estos dos por separado:

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

Su incluidas en este repo, comprobar que funciona:

https://github.com/goktugyil/EZSwiftExtensions

+0

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

+0

Aquí hay uno actualizado: https://github.com/goktugyil/EZSwiftExtensions/blob/b06d55a8f5d4fda9f5bca03af4863252dcf53e10/Sources/EZSwiftFunctions.swift – Esqarrouth

2

En C Objetivo:

1) Para la obtención de versión de la aplicación que tiene que utilizar un:

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

2) Para obtener la versión de compilación, debe utilizar un:

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

Esto es lo que trabajó 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)") 
0

Sólo por nota

Para obtener el valor localizado de cualquier tecla que deben CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)

Cuestiones relacionadas