¿Cómo obtengo la versión de la aplicación y el número de compilación usando Swift?
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?
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
Actualizado para Swift 3.0
Los NS
prefijos - 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
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.
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()
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!