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