Подтвердить что ты не робот

Получение версии и сбор информации с помощью Swift

Я пытаюсь получить доступ к главному NSBundle для получения информации о версии и сборке. Дело в том, что я хочу попробовать это быстро, я знаю, как получить его в Objective-C с помощью Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; , Пока я не знаю, с чего начать с swift, я попытался написать его в новом синтаксисе, но безрезультатно.

4b9b3361

Ответ 1

Что не так с синтаксисом Swift? Это похоже на работу:

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

Ответ 2

Версия Swift 3/4

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

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

как видно здесь.

Ответ 3

Для окончательной версии Xcode 6 используйте

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

"?" персонаж после infoDictionary важен здесь

Ответ 4

Смиренный путь для AppName, AppVersion и 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))."
   }
}

Ответ 5

Вот простой способ получить сборку и версию.

Для 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)
   }

Для цели C

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

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

Дайте мне знать, если возникнет проблема. Это работает для меня.

Ответ 6

В swift я сделал бы это расширение для UIApplication, например:

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

Затем вы можете просто использовать следующее, чтобы получить все, что вам нужно:

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

Ответ 7

//Возвращает номер версии приложения

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

//Возвращаем номер сборки приложения

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

Ответ 8

Этот код работает для Swift 3, Xcode 8:

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

Ответ 9

Для Swift 3 замените NSBundle на Bundle, а mainBundle заменяется просто основным.

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

Ответ 10

[Обновление: Xcode 6.3.1] Я пробовал все вышеперечисленное, и ни одна из них не работает в Xcode 6.3.1, но я обнаружил, что это:

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

Ответ 11

Другим вариантом является определение в AppDelegate переменных:

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

на которые можно ссылаться как переменные в AppDelegate

Ответ 12

Swift 3:

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

Ответ 13

Версия SWIFT 3

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()

Ответ 14

Чтобы получить результат для рамки вы можете использовать

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

или в тестах

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