Я пытаюсь получить доступ к основному NSBundle для получения информации о версии и сборке. Дело в том, что я хочу быстро попробовать, я знаю, как получить его в Objective-C с помощью Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
. Но я не знаю, с чего начать с swift, я безуспешно пытался написать его в новом синтаксисе.
92
Ответы:
Что не так с синтаксисом Swift? Кажется, это работает:
if let text = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { print(text) }
источник
let
но в остальном это выглядит правильно.let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
Версия 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)" }
как видно здесь .
источник
Для окончательной версии Xcode 6 используйте
NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String
Знак "?" здесь важен символ после infoDictionary
источник
Вот простой способ получить сборку и версию.
Для 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"];
Сообщите мне, если возникнут проблемы. Это работает для меня.
источник
Быстрый способ
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))." } }
источник
Bundle.main
был пустойinfoDictionary
для меня; может быть, потому что я делаю это из фреймворка, а не из исполняемого файла или приложения?Bundle(for: MyClass.self)
содержит ожидаемые значения.Я бы быстро сделал это как расширение для 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)
источник
// Возвращает номер версии приложения
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 }
источник
Swift 5.0
Я создал оболочку для Swift 5, чтобы получить несколько строк, связанных с приложением, в одном месте во всех моих приложениях под названием AppInfo .
struct AppInfo { var appName : String { return readFromInfoPlist(withKey: "CFBundleName") ?? "(unknown app name)" } var version : String { return readFromInfoPlist(withKey: "CFBundleShortVersionString") ?? "(unknown app version)" } var build : String { return readFromInfoPlist(withKey: "CFBundleVersion") ?? "(unknown build number)" } var minimumOSVersion : String { return readFromInfoPlist(withKey: "MinimumOSVersion") ?? "(unknown minimum OSVersion)" } var copyrightNotice : String { return readFromInfoPlist(withKey: "NSHumanReadableCopyright") ?? "(unknown copyright notice)" } var bundleIdentifier : String { return readFromInfoPlist(withKey: "CFBundleIdentifier") ?? "(unknown bundle identifier)" } var developer : String { return "my awesome name" } // lets hold a reference to the Info.plist of the app as Dictionary private let infoPlistDictionary = Bundle.main.infoDictionary /// Retrieves and returns associated values (of Type String) from info.Plist of the app. private func readFromInfoPlist(withKey key: String) -> String? { return infoPlistDictionary?[key] as? String } }
Вы можете использовать это так:
print("The apps name = \(AppInfo.appname)")
источник
CFBundleDisplayName
Этот код работает для Swift 3, Xcode 8:
let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0" let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
источник
Для Swift 3 замените NSBundle на Bundle, а mainBundle заменяется просто на main.
let AppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
источник
[Обновление: Xcode 6.3.1] Я пробовал все вышеперечисленное, и ни один из них не работал в Xcode 6.3.1, но я обнаружил, что это работает:
(NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String)!
источник
Другой вариант - определить в 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
источник
Swift 3:
let textVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
источник
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()
источник
Чтобы получить результат для фреймворка, вы можете использовать
let version = Bundle(for: type(of: self)).infoDictionary?["CFBundleShortVersionString"] as? String
или в тестах
let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
источник