¿Cómo mostrar programáticamente la versión / número de compilación de destino en la aplicación iOS?

135

¿Cómo puedo obtener programáticamente el valor de target version, como en la imagen a continuación?

Como se ve en la ventana Propiedades del objetivo de mi proyecto Xcode. Quiero mostrar esto en la pantalla de inicio de mi aplicación para saber qué versión están usando actualmente las personas.

Delgado
fuente

Respuestas:

392

¡Hay 2 números!

El número de versión de marketing es para los clientes, llamado número de versión . Comienza con 1.0 y sube para actualizaciones importantes a 2.0 , 3.0 , para actualizaciones menores a 1.1 , 1.2 y para correcciones de errores a 1.0.1 , 1.0.2 . Este número está orientado sobre lanzamientos y nuevas características. No tiene que detenerse en 9, 1.11.23 es un número de versión razonable.

El número de compilación es principalmente el número interno de compilaciones que se han realizado hasta entonces. Pero algunos usan otros números como el número de sucursal del repositorio o su número de confirmación. Este número debe ser único para distinguir las diferentes compilaciones, que solo tienen cambios incrementales menores.


Para obtener el número de versión :

C objetivo:

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

Swift <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (probado con 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Para obtener el número de compilación :

C objetivo:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Swift <3.0:

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

Swift 3.0+ (probado hasta 5.0):

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

Si quieres ambos en uno:

Primero use las líneas anteriores y luego la siguiente.

C objetivo:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift (probado hasta 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Notas:

Los valores en el paquete principal no siempre están presentes, por ejemplo, en una aplicación de línea de comandos no hay CFBundleShortVersionStringo CFBundleVersion, por lo que los métodos devolveránnil y se bloqueará porque en el código hace un downcast incorrecto. Pero en las aplicaciones normales de Cocoa para iOS y Mac, estos valores están definidos y no se eliminarán.

Esto se prueba con Xcode Versión 7.3 (7D175) . El número de compilación a menudo se escribe entre paréntesis / llaves. El número de compilación está en hexadecimal o decimal.

versión incorporada


En Xcode , puede aumentar automáticamente el número de compilación como un número decimal colocando lo siguiente en la Run scriptfase de compilación en la configuración del proyecto

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Para el número de compilación hexadecimal, use este script

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Para Xcodehacer lo siguiente:

Paso 1

paso 1

Paso 2

paso 2

Paso 3

paso 3

Binario
fuente
44
Solo para agregar para el ejemplo anterior, "CFBundleVersion" es el Build = 300, "CFBundleShortVersionString" es la Versión = 0.41. La respuesta de Viktor debería ser la respuesta correcta.
justinkoh
1
Tuve problemas con los números hexadecimales una vez. Apple declara usar enteros: developer.apple.com/library/ios/documentation/general/Reference/…
hashier
¿Sabes si hay constantes de cadena para @ "CFBundleShortVersionString" y @ "CFBundleVersion"?
igrek
Ahora que los sistemas CI / CD son bastante comunes, es posible que desee señalar las trampas del uso de scripts de compilación para establecer versiones # 's con ellos.
Sam Ballantyne
1
Las cosas han sido renombradas para Swift 3.0: es Bundle.main.object(forInfoDictionaryKey: "...")ahora.
Rafael
13

No necesita cambiar nada en su proyecto o Xcode. Aquí está la 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
¿cual respuesta? no lo veo
Esqarrouth
Solo hay una respuesta, está en su segundo párrafo
Daniel Galasko el
3
Sí, 1. Hay demasiado ruido y poca señal en su respuesta. 2. Esto es rápido, eso es objetivo-c. 3. Eso es de la era ios5
Esqarrouth
Las cosas han sido renombradas para Swift 3.0: es Bundle.main.object(forInfoDictionaryKey: "...")ahora.
Rafael
5

Aquí el mismo código para Swift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
tanaschita
fuente
Bundle.maintenía un vacío infoDictionarypara mí; tal vez porque lo estoy haciendo desde un marco, no un ejecutable o aplicación? Bundle(for: MyClass.self)Contiene los valores esperados.
Rafael
4

Mostrar mediante programación la versión y el número de compilación - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Sandip Patel - SM
fuente
1

También puedes usar como

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Luego puede usar en cualquier lugar cuando declara Globalmente.

print(appVersion)

Salida:

Version: #1.0 (#1.0.3)
Sivabalaa Jothibose
fuente
1

Hice una extensión para Bundle para que sea fácil de usar

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
Amr enojado
fuente