web-dev-qa-db-fra.com

Obtenir des informations de version et de construction avec Swift

J'essaie d'accéder à NSBundle principal pour récupérer les informations de version et de construction. La chose est, je veux l'essayer dans Swift, je sais le récupérer dans Objective-C avec Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];. Pourtant, je ne sais pas par où commencer avec Swift, j'ai essayé de l'écrire dans la nouvelle syntaxe sans succès.

71
Ken-UbiDex

Quel était le problème avec la syntaxe Swift? Cela semble fonctionner:

if let text = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
    print(text)
}
126
Connor

Swift 3/4 Version

func version() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "\(version) build \(build)"
} 

Swift 2.x Version

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as String
    let build = dictionary["CFBundleVersion"] as String
    return "\(version) build \(build)"
}

comme vu ici .

90
Dan Rosenstark

Pour la version finale de Xcode 6, utilisez

NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String

Le "?" caractère après infoDictionary est important ici

17
JulianM

Façon rapide pour AppName, AppVersion et BuildNumber...

if let dict = NSBundle.mainBundle().infoDictionary {
   if let version = dict["CFBundleShortVersionString"] as? String,
       let bundleVersion = dict["CFBundleVersion"] as? String,
       let appName = dict["CFBundleName"] as? String {
           return "You're using \(appName) v\(version) (Build \(bundleVersion))."
   }
}
9
Chris

// Retourne le numéro de version de l'application

public static var appVersion: String? {
    return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}

// Renvoie le numéro de build de l'application

public static var appBuild: String? {
    return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String
}
7
Pratyush Pratik

Dans Swift, je le ferais comme extension pour UIApplication, comme ceci:

extension UIApplication {

    func applicationVersion() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
    }

    func applicationBuild() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
    }

    func versionBuild() -> String {

        let version = self.applicationVersion()
        let build = self.applicationBuild()

        return "v\(version)(\(build))"
    }
}

Ensuite, vous pouvez simplement utiliser ce qui suit pour obtenir tout ce dont vous avez besoin:

let version = UIApplication.sharedApplication.applicationVersion() // 1
let build = UIApplication.sharedApplication.applicationBuild() // 80
let both = UIApplication.sharedApplication.versionBuild() // 1(80)
7
Jiri Trecak

Voici un moyen simple d'obtenir Build et version. 

Pour Swift 4.X

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
     print(version)
   }

 if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
     print(build)
   }

Pour l'objectif C

NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

NSString * currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

Faites-moi savoir s'il y a un problème. Cela fonctionne pour moi.

6
Ashu

Ce code fonctionne pour Swift 3, Xcode 8:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
2
Crashalot

[Mise à jour: Xcode 6.3.1] J'ai essayé tout ce qui précède et aucun de ceux-ci ne fonctionne dans Xcode 6.3.1 mais j'ai constaté que cela ne:

(NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String)!
1
SunburstEnzo

Pour Swift 3, remplacez NSBundle par Bundle et mainBundle est remplacé simplement par main.

let AppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
1
Tarika Chawla

Une autre option consiste à définir dans l’AppDelegate les variables:

var applicationVersion:String {
    return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
}
var applicationBuild:String  {
    return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
}
var versionBuild:String  {
    let version = self.applicationVersion
    let build = self.applicationBuild
    return "version:\(version) build:(\(build))"
}

qui peuvent être référencés en tant que variables dans le AppDelegate

1
user3620768

Pour avoir un résultat pour le framework, vous pouvez utiliser

let version = Bundle(for: type(of: self)).infoDictionary?["CFBundleShortVersionString"] as? String

ou dans des tests

let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
0
yoAlex5

Swift 3:

let textVersion
 = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
0
Zvonimir Taslak

Swift 3 Version

if let infoPath = Bundle.main.path(forResource: "Info.plist", ofType: nil),
        let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath),
        let infoDate = infoAttr[.creationDate] as? Date
{
    return infoDate
}
return Date()
0
Ryan X