versiones programar para descargar desarrollo aprender apple ios swift

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 } }