¿Cómo puede mi aplicación de iPhone detectar su propio número de versión?

254

Estoy escribiendo una aplicación para iPhone. Ya se ha publicado, pero me gustaría agregar una función donde se muestre su número de versión.

Prefiero no tener que hacer esto manualmente con cada versión que publico ...

¿Hay alguna manera en el objetivo-C para averiguar cuál es la versión de mi aplicación?

Brad Larson
fuente
1
Esta pregunta ya ha sido respondida aquí stackoverflow.com/a/16888788/2890157 .
Akshat Singhal
1
.. la pregunta vinculada es 4 años después, por lo que el verdadero problema aquí es que cmos nunca aceptó una respuesta. En cualquier caso, las respuestas de la pregunta vinculada son útiles, como lo son las respuestas aquí. En ambos hilos, mire más allá de la primera respuesta: a veces hay más información actualizada sobre una respuesta posterior.
ToolmakerSteve

Respuestas:

222

Como describo aquí , utilizo un script para reescribir un archivo de encabezado con mi número de revisión de Subversion actual. Ese número de revisión se almacena en la constante kRevisionNumber. Entonces puedo acceder a la versión y al número de revisión usando algo similar a lo siguiente:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

que creará una cadena con el formato "Versión 1.0 (51)".

Brad Larson
fuente
152
Eso devolvió mi versión de compilación, así que usé esta. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner
66
CFBundleVersion es incorrecto, porque Xcode rellena erróneamente esa entrada de plist con el número de compilación y no el número de versión. jspooner es correcto.
Oscar
44
Consulte stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 para obtener una excelente explicación de los números de versión frente a compilación. Confirma CFBundleShortVersionStringlo que normalmente querrías para 'versión' y CFBundleVersionpara Número de compilación.
Rory
3
kRevisionNumber no parece funcionar para mí. Para obtener la salida especificada, hice esto (usando el arreglo de @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam
147

Sobre la base de la respuesta de Brad Larson, si tiene información de versión mayor y menor almacenada en la lista de información (como hice en un proyecto en particular), esto funcionó bien para mí:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Ahora, acelerar una versión menor manualmente puede ser una molestia, por lo que es ideal usar un truco de número de revisión del repositorio de origen. Si no lo ha atado (como no lo hice), el fragmento anterior puede ser útil. También saca el nombre para mostrar de la aplicación.

idStar
fuente
59

Versión rápida para ambos por separado:

Swift 3

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

Swift 2

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
42

Esto es lo que hice en mi solicitud

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

Esperemos que esta simple respuesta ayude a alguien ...

Arkady
fuente
1
Para mis necesidades, esto es genial. Gracias. +1
David DelMonte
1
Esto devuelve el nombre de construcción, no la versión
chancyWu
@chancyWu, CFBundleShortVersionString parece dar la versión.
Brian F Leighty
31

Puede especificar la CFBundleShortVersionStringcadena en su plist.info y leerla mediante programación utilizando la API proporcionada .

Jasper Bekkers
fuente
30

Hay dos cosas: la versión de compilación y la versión de la aplicación.

  1. Para obtener la versión de la aplicación:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Para obtener la versión de compilación:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Shaik Riyaz
fuente
¿Hay alguna diferencia entre estos dos? Ambos me devuelven lo mismo.
jjnevis
Sí, puede que su número de compilación y la versión de la aplicación sean los mismos en la configuración.
Shaik Riyaz
De acuerdo, solo tengo una configuración en mi RAKEFILE: app.version (estoy usando RubyMotion). Supongo que cualquiera lo hará para mis necesidades. Gracias
jjnevis
Gracias amigo. Trabajó sin problemas.
Felipe
1
FYI Es preferible usar en objectForInfoDictionaryKey:lugar deinfoDictionary] objectForKey: porque el primero devuelve el valor localizado (si hay uno). Probablemente no haga la diferencia aquí;)
deanWombourne
17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
John Erck
fuente
1
¡Exactamente lo que necesitaba!
Julio
16

Una forma sucinta de obtener una cadena de versión en formato XYZ es:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

O, por solo XY:

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

Ambos fragmentos devuelven cadenas que asignaría a la propiedad de texto de su objeto de etiqueta, por ejemplo

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
maldita sea
fuente
7

Puedes intentar usar el diccionario como: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Abhishek Verma
fuente
4

Lea el archivo info.plist de su aplicación y obtenga el valor de la clave CFBundleShortVersionString. Leer info.plist le dará un objeto NSDictionary

perdido en el transito
fuente
4

Puede usar infoDictionary que obtiene los detalles de la versión de info.plist de su aplicación. Este código funciona para Swift 3. Simplemente llame a este método y muestre la versión en cualquier elemento de interfaz de usuario preferido.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}
rajat chauhan
fuente
3

Swift 5:

Hay dos cosas: versión de la aplicación y versión de compilación

  • Para obtener la versión de la aplicación:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Para obtener la versión de compilación:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Gracias @Brad Larson♦mucho

dengST30
fuente
1

Si necesita una combinación de la versión y el número de compilación , aquí hay una forma corta de usar Swift 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Agregue un as! Stringal final de la línea appVersiono buildNumpara obtener solo esa parte como un Stringobjeto. Sin embargo, no hay necesidad de eso si estás buscando el completo versionInfo.

¡Espero que esto ayude!

Jeehut
fuente
1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Basado en la respuesta de @rajat chauhan sin un reparto forzado String.

apex39
fuente
0

Esto es algo bueno de manejar con un sistema de control de revisión. De esa manera, cuando recibe un informe de error de un usuario, puede verificar esa revisión de código y (con suerte) reproducir el error ejecutando exactamente el mismo código que el usuario.

La idea es que cada vez que realice una compilación, ejecutará un script que obtenga el número de revisión actual de su código y actualice un archivo dentro de su proyecto (generalmente con alguna forma de reemplazo de token). Luego puede escribir una rutina de manejo de errores que siempre incluya el número de revisión en la salida del error, o puede mostrarlo en una página "Acerca de".

RedFilter
fuente
0

Puedes probar este método:

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