2009-09-29 14 views

Respuesta

24

Después de una búsqueda adicional y pruebas, he encontrado la solución a mí mismo.

NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; 
NSLog(@"%i Keys: %@", [infoDictionary count], 
      [[infoDictionary allKeys] componentsJoinedByString: @" ,"]); 

Este snipplet me dio el siguiente resultado:

20 Claves: NSBundleResolvedPath, CFBundleVersion, NSBundleInitialPath, CFBundleIdentifier, NSMainNibFile, CFBundleIconFile, CFBundleInfoPlistURL, CFBundleExecutable, DTSDKName, UIStatusBarStyle, CFBundleDevelopmentRegion, DTPlatformName, CFBundleInfoDictionaryVersion, CFBundleSupportedPlatforms, CFBundleExecutablePath, CFBundleDisplayName, LSRequiresIPhoneOS, CFBundlePackageType, CFBundleSignature, CFBundleName

Así que la solución es tan simple como:

NSString *version =[[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleVersion"]; 

Sin embargo, esto es no la actual versión del proyecto como se ve en la pantalla, pero la versión del paquete del archivo plist.

+1

Creo que el versionado incluye agregar repositorios y configurar SCM para su proyecto en XCode y esa probablemente no sea la versión que desea (aunque puedo estar equivocado). – Eimantas

+0

Si configura el valor de CFBundleVersion en su archivo plist en $ {CURRENT_PROJECT_VERSION}, se reemplazará con lo que está en la versión actual del proyecto desde la configuración de compilación. A continuación, puede usar AgVtool bump para incrementar el número de compilación. – mjk

+2

Además, se podría usar 'CFString'' kCFBundleVersionKey' en lugar de la cadena codificada '@" CFBundleVersion "', convertida a 'NSString' si es necesario, como se requeriría en el código anterior. – trss

12

Mira en el archivo de Info.plist que debe tener claves como CFBundleVersion y CFBundleShortVersionString

+6

Más información: http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPRuntimeConfig/ Artículos/PListKeys.html # // apple_ref/doc/uid/20001431-102364 http://www.dribin.org/dave/blog/archives/2006/08/02/versioning_os_x_apps/ –

+0

ghommey - hay una guía para la lista programando en developer.apple.com. Estoy seguro de que puede averiguarlo por sí mismo ahora,) – Eimantas

7

Esos elementos en Build Info no están disponibles para su aplicación creada. Son marcadores de posición que posiblemente podría incluir en su aplicación. Lo que está en su aplicación es cualquier cosa que coloque, por ejemplo, en la carpeta de Recursos de su aplicación, como cualquier archivo de texto, listas, o una buena imagen de su ingeniero de versiones.

Ahora, puede colocar algunos de los elementos en la ventana Información de construcción en un info.plist, usando identificadores especiales, como $ {VERSION_INFO_PREFIX} u otro token. Los tokens están disponibles si hace clic en cualquiera de los elementos en el lado izquierdo en la ventana que ha incluido arriba. Por ejemplo, haga clic en la palabra "Versión actual del proyecto" y copie el token que ve en la parte inferior, "CURRENT_PROJECT_VERSION". Luego ve a tu archivo plist y agrega una entrada. Dale el nombre que quieras o "Versión actual del proyecto". Pega en $ {CURRENT_PROJECT_VERSION} en el lado derecho. Ahora ese valor está disponible para usted desde su aplicación, mediante programación. Por supuesto, alguien ahora tiene que ingresar ese valor en el lugar apropiado, ya sea en la ventana Información de construcción o en otro lugar. Simplemente podría ser más fácil simplemente administrar esto y campos como este en el archivo info.plist. Depende de ti cómo te gustaría manejar estas cosas.

Aquí es cómo consigo información de la versión de mi info.plist:

+ (NSString *) getAppVersionNumber; 
{ 
    NSString *myVersion, 
       *buildNum, 
       *versText; 

    myVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
    buildNum = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; 
    if (myVersion) { 
     if (buildNum) 
      versText = [NSString stringWithFormat:@"Version: %@ (%@)", myVersion, buildNum]; 
     else 
      versText = [NSString stringWithFormat:@"Version: %@", myVersion]; 
    } 
    else if (buildNum) 
     versText = [NSString stringWithFormat:@"Version: %@", buildNum]; 
    NSLog(versText); 
    return versText; 
} 
+0

"Valor indefinido o basura devuelto a la persona que llama"! Eliminar versText y poner una declaración de devolución en su posición. Al final devuelve nil. – testing

+1

No haga 'NSLog' así. Debería ser 'NSLog (@"% @ ", versText);'. Si 'versText' permanece indefinido, lo cual es posible desde el código, esto causará un bloqueo. – Mundi

4
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleVersion"]; 

me devuelve siempre el mismo valor (versión inicial), incluso si cambio la versión de la configuración del proyecto, pero.

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; 

hace el truco.

+0

CFBundleVersion: un código de ensamblaje. No es una cadena de versión. – ETech

1

Para los perezosos aquí es la versión rápida:

NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")! 
1

NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"];

Cuestiones relacionadas