¿Cómo obtengo la versión de la aplicación y el número de compilación usando Swift?

Resuelto Øyvind Vik asked hace 54 años • 34 respuestas

Tengo una aplicación de IOS con un back-end de Azure y me gustaría registrar ciertos eventos, como inicios de sesión y qué versiones de la aplicación están ejecutando los usuarios.

¿Cómo puedo devolver la versión y el número de compilación usando Swift?

Øyvind Vik avatar Jan 01 '70 08:01 Øyvind Vik
Aceptado

EDITAR

Actualizado para Swift 4.2

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String

EDITAR

Como lo señaló @azdev en la nueva versión de Xcode, obtendrá un error de compilación al probar mi solución anterior. Para resolver esto, simplemente edítelo como se sugiere para desenvolver el diccionario del paquete usando un archivo !

let nsObject: AnyObject? = Bundle.main.infoDictionary!["CFBundleShortVersionString"]

Fin de edición

Simplemente use la misma lógica que en Objective-C pero con algunos pequeños cambios.

//First get the nsObject by defining as an optional anyObject
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"]

//Then just cast the object as a String, but be careful, you may want to double check for nil
let version = nsObject as! String
David avatar Sep 24 '2014 08:09 David

Actualizado para Swift 3.0

Los NSprefijos - ahora desaparecieron en Swift 3.0 y varias propiedades/métodos han cambiado de nombre para ser más Swifty. Así es como se ve esto ahora:

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

Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber

Antigua respuesta actualizada

He estado trabajando mucho con Frameworks desde mi respuesta original, por lo que quería actualizar mi solución a algo que sea más simple y mucho más útil en un entorno de paquetes múltiples:

extension NSBundle {

    var releaseVersionNumber: String? {
        return self.infoDictionary?["CFBundleShortVersionString"] as? String
    }

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

}

Ahora, esta extensión será útil en aplicaciones para identificar tanto el paquete principal como cualquier otro paquete incluido (como un marco compartido para programación de extensiones o terceros marcos como AFNetworking), así:

NSBundle.mainBundle().releaseVersionNumber
NSBundle.mainBundle().buildVersionNumber

// or...

NSBundle(URL: someURL)?.releaseVersionNumber
NSBundle(URL: someURL)?.buildVersionNumber

Respuesta original

Quería mejorar algunas de las respuestas ya publicadas. Escribí una extensión de clase que se puede agregar a su cadena de herramientas para manejar esto de una manera más lógica.

extension NSBundle {

class var applicationVersionNumber: String {
    if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"]

¿como? Cadena {devolver versión} devuelve "Número de versión no disponible" }

class var applicationBuildNumber: String {
    if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String {
        return build
    }
    return "Build Number Not Available"
}

}

Ahora puedes acceder a esto fácilmente mediante:

let versionNumber = NSBundle.applicationVersionNumber
Blake Merryman avatar Apr 30 '2015 21:04 Blake Merryman

Sé que esto ya ha sido respondido pero personalmente creo que esto es un poco más claro:

Rápido 3.0:

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
    self.labelVersion.text = version
}

Rápido <2.3

if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
    self.labelVersion.text = version
}

De esta manera, la versión if let se encarga del procesamiento condicional (estableciendo el texto de la etiqueta en mi caso) y si infoDictionary o CFBundleShortVersionString son nulos, el desenvolvimiento opcional hará que se omita el código.

Timothy Tripp avatar Feb 04 '2015 16:02 Timothy Tripp

También sé que esto ya ha sido respondido pero resumí las respuestas anteriores:

(*)Actualizado para extensiones

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }
    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }
    var releaseVersionNumberPretty: String {
        return "v\(releaseVersionNumber ?? "1.0.0")"
    }
}

Uso:

someLabel.text = Bundle.main.releaseVersionNumberPretty

@Deprecated: respuestas antiguas

Rápido 3.1 :

class func getVersion() -> String {
    guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
        return "no version info"
    }
    return version
}

Para versiones anteriores :

class func getVersion() -> String {
    if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "no version info"
}

Entonces, si desea configurar el texto de la etiqueta o desea utilizarlo en otro lugar;

self.labelVersion.text = getVersion()
Gunhan avatar Mar 06 '2015 06:03 Gunhan

2023, veloz 3-∞

extension Bundle {
    public var appName: String           { getInfo("CFBundleName") }
    public var displayName: String       { getInfo("CFBundleDisplayName") }
    public var language: String          { getInfo("CFBundleDevelopmentRegion") }
    public var identifier: String        { getInfo("CFBundleIdentifier") }
    public var copyright: String         { getInfo("NSHumanReadableCopyright").replacingOccurrences(of: "\\\\n", with: "\n") }
    
    public var appBuild: String          { getInfo("CFBundleVersion") }
    public var appVersionLong: String    { getInfo("CFBundleShortVersionString") }
    //public var appVersionShort: String { getInfo("CFBundleShortVersion") }
    
    fileprivate func getInfo(_ str: String) -> String { infoDictionary?[str] as? String ?? "⚠️" }
}

uso (muestra de SwiftUI):

Text("Ver: \(Bundle.main.appVersionLong) (\(Bundle.main.appBuild)) ")

Text(Bundle.main.copyright)
    .font(.system(size: 10, weight: .thin))
    .multilineTextAlignment(.center)

Bonificación: ¡los derechos de autor admiten \n símbolos!

ingrese la descripción de la imagen aquí

Andrew_STOP_RU_WAR_IN_UA avatar Aug 24 '2021 18:08 Andrew_STOP_RU_WAR_IN_UA