ios - programar - ¿Cómo obtengo la versión de la aplicación y el número de compilación utilizando Swift?
versiones swift ios (21)
Aquí hay una versión actualizada para Swift 3.2:
extension UIApplication
{
static var appVersion:String
{
if let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
{
return "/(appVersion)"
}
return ""
}
static var buildNumber:String
{
if let buildNum = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String)
{
return "/(buildNum)"
}
return ""
}
static var versionString:String
{
return "/(appVersion)./(buildNumber)"
}
}
Tengo una aplicación IOS con un back-end de Azure y me gustaría registrar ciertos eventos, como los inicios de sesión y las versiones de los usuarios de la aplicación que se ejecutan.
¿Cómo puedo devolver la versión y el número de compilación utilizando Swift?
Habiendo examinado la documentación, creo que lo siguiente es más limpio:
let version =
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")
as? String
Source : "Se prefiere el uso de este método en lugar de otros métodos de acceso porque devuelve el valor localizado de una clave cuando hay una disponible".
Hice una extensión en paquete
extension Bundle {
var appName: String {
return infoDictionary?["CFBundleName"] as! String
}
var bundleId: String {
return bundleIdentifier!
}
var versionNumber: String {
return infoDictionary?["CFBundleShortVersionString"] as! String
}
var buildNumber: String {
return infoDictionary?["CFBundleVersion"] as! String
}
}
y luego usarlo
versionLabel.text = "/(Bundle.main.appName) v /(Bundle.main.versionNumber) (Build /(Bundle.main.buildNumber))"
Mi respuesta (en agosto de 2015), dado que Swift sigue evolucionando:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Para Swift 2.0
//First get the nsObject by defining as an optional anyObject
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
let version = nsObject as! String
Para Swift 4.0
let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!
Para Swift 1.2 es:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Para Swift 3.0 NSBundle no funciona, el siguiente código funciona perfectamente.
let versionNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
as! String
y solo para el número de compilación es:
let buildNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
as! String
Confusamente, ''CFBundleVersion'' es el número de compilación ingresado en Xcode en General-> Identity.
Sé que esto ya ha sido respondido, pero personalmente creo que esto es un poco más limpio:
Swift 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 (configurando 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 envolví 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
@ Deprecado: Respuestas antiguas
Swift 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"
}
Por lo tanto, si desea establecer el texto de la etiqueta o si desea utilizar en otro lugar;
self.labelVersion.text = getVersion()
Xcode 9.4.1 Swift 4.1
Tenga en cuenta el uso de localizedInfoDictionary para seleccionar la versión de idioma correcta del nombre para mostrar del paquete.
var displayName: String?
var version: String?
var build: String?
override func viewDidLoad() {
super.viewDidLoad()
// Get display name, version and build
if let displayName = Bundle.main.localizedInfoDictionary?["CFBundleDisplayName"] as? String {
self.displayName = displayName
}
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.version = version
}
if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
self.build = build
}
}
para cualquier persona interesada, hay una biblioteca agradable y ordenada llamada SwifterSwift
disponible en github y también completamente documentada para cada versión de swift (consulte swifterswift.com ).
Usar esta biblioteca, leer la versión de la aplicación y el número de compilación sería tan fácil como esto:
import SwifterSwift
let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion
Actualizado para Swift 3.0
Los prefijos NS
ahora desaparecieron en Swift 3.0 y varias propiedades / métodos han cambiado los nombres para ser más Swifty. Esto es lo que parece 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
Respuesta antigua actualizada
He estado trabajando mucho con Frameworks desde mi respuesta original, así que quería actualizar mi solución a algo que es 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 la 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 {return version} return "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" } }
Así que ahora puedes acceder a esto fácilmente por:
let versionNumber = NSBundle.applicationVersionNumber
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 intentar mi solución anterior, para resolver esto, simplemente edítelo como se sugiere para desenvolver el diccionario de paquetes usando un!
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
Edición final
Simplemente use la misma lógica que en Objective-C pero con algunos cambios pequeños
//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
Espero que esto te ayude.
David
SWIFT 4
// Primero obtenga el nsObject definiendo como un AnyObject opcional
let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
// Luego, simplemente lance el objeto como una Cadena, pero tenga cuidado, puede que quiera verificar dos veces si no
let version = nsObject as! String
Swift 3:
Número de versión
if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }
Número de compilación
if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }
Swift 4, Extensión útil para Bundle
import Foundation
public extension Bundle {
public var shortVersion: String {
if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
return result
} else {
assert(false)
return ""
}
}
public var buildVersion: String {
if let result = infoDictionary?["CFBundleVersion"] as? String {
return result
} else {
assert(false)
return ""
}
}
public var fullVersion: String {
return "/(shortVersion)(/(buildVersion))"
}
}
Swift 4
func getAppVersion() -> String {
return "/(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}
Bundle.main.infoDictionary! ["CFBundleShortVersionString"]
Rápida sintaxis
let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
Xcode 8, Swift 3:
let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
extension UIApplication {
static var appVersion: String {
if let appVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
return "/(appVersion)"
} else {
return ""
}
}
static var build: String {
if let buildVersion = NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) {
return "/(buildVersion)"
} else {
return ""
}
}
static var versionBuild: String {
let version = UIApplication.appVersion
let build = UIApplication.build
var versionAndBuild = "v/(version)"
if version != build {
versionAndBuild = "v/(version)(/(build))"
}
return versionAndBuild
}
}
Atención: debe usarlo si lo permite aquí en caso de que la versión de la aplicación o la compilación no estén configuradas, lo que provocará que se bloquee si intenta usarlas. para desenvolver
public var appVersionNumberString: String {
get {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
}