Как получить версию приложения и номер сборки с помощью Swift?
У меня есть приложение IOS с Azure back-end, и я хотел бы регистрировать определенные события, такие как логины и какие версии пользователей приложения запущены.
Как я могу вернуть версию и номер сборки с помощью Swift?
20 ответов
редактировать
обновлено для Swift 4.2
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as? String
редактировать
как отметил @azdev в новой версии Xcode, вы получите ошибку компиляции для попытки моего предыдущего решения, чтобы решить эту проблему, просто отредактируйте ее, как было предложено развернуть словарь пакета с помощью !
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
Редактирование
просто используйте ту же логику, что и в Objective-C, но с некоторыми небольшими изменения
//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
Я надеюсь, что это поможет вам.
Дэвид
Я знаю, что на это уже ответили, но лично я думаю, что это немного чище:
Swift 3.0:
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
Swift
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
таким образом, версия if let заботится об условной обработке (установка текста метки в моем случае), и если infoDictionary или CFBundleShortVersionString равны нулю, необязательное разворачивание приведет к пропуску кода.
обновлено для Swift 3.0
на NS
-префиксы теперь исчезли в Swift 3.0, и несколько свойств / методов изменили имена, чтобы быть более быстрыми. Вот как это выглядит сейчас:
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
}
Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber
Старый Обновленный Ответ
Я много работал с фреймворками с момента моего первоначального ответа, поэтому я хотел обновить мое решение до чего-то более простого и гораздо полезнее в мульти-пакет среды:
extension NSBundle { var releaseVersionNumber: String? { return self.infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return self.infoDictionary?["CFBundleVersion"] as? String } }
теперь это расширение будет полезно в приложениях для идентификации как основных bundle и любые другие включенные пакеты (например, общая платформа для Программирование расширений или третьи фреймворки, такие как AFNetworking), например:
NSBundle.mainBundle().releaseVersionNumber NSBundle.mainBundle().buildVersionNumber // or... NSBundle(URL: someURL)?.releaseVersionNumber NSBundle(URL: someURL)?.buildVersionNumber
Оригинальный Ответ
Я хотел улучшить некоторые из ответов, уже опубликованных. Я написал расширение класса, которое можно добавить в цепочку инструментов разберись с этим. более логичный способ.
extension NSBundle { class var applicationVersionNumber: String { if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"]
как? Строка { вернуться версия } return " номер версии недоступен" }
class var applicationBuildNumber: String { if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String { return build } return "Build Number Not Available" } }
Итак, теперь вы можете легко получить доступ к этому:
let versionNumber = NSBundle.applicationVersionNumber
Я также знаю, что на это уже ответили, но я завернул предыдущие ответы:
(*)обновлен для расширения
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")"
}
}
использование:
someLabel.text = Bundle.main.releaseVersionNumberPretty
@Deprecated: старые ответы
Swift 3.1:
class func getVersion() -> String {
guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
return "no version info"
}
return version
}
для более старых версий:
class func getVersion() -> String {
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
return version
}
return "no version info"
}
Итак, если вы хотите установить текст метки или хотите использовать где-то еще;
self.labelVersion.text = getVersion()
Я сделал расширение на Bundle
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
}
}
и затем использовать его
versionLabel.text = "\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))"
на Swift 4.0
let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!
для Swift 3.0 NSBundle не работает, следующий код работает отлично.
let versionNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
as! String
и только для номера сборки это:
let buildNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
as! String
смущающе "CFBundleVersion" является построить номер, введенный в Xcode в General - >Identity.
Xcode 8, Swift 3:
let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
мой ответ (по состоянию на август 2015), учитывая, что Swift продолжает развиваться:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Xcode 9.4.1 Swift 4.1
обратите внимание на использование localizedInfoDictionary для выбора правильной языковой версии отображаемого имени пакета.
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
}
}
просмотрев документацию, я считаю, что следующее чище:
let version =
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")
as? String
источник: "Использование этого метода предпочтительнее других методов доступа, поскольку он возвращает локализованное значение ключа, когда он доступен."
для Swift 1.2 это:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Swift 3:
Номер Версии
if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }
номер сборки
if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }
Swift 4
func getAppVersion() -> String {
return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}
пакета.главный.инфодикториум!["CFBundleShortVersionString"]
Swift старый синтаксис
let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
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
}
}
внимание: Вы должны использовать, если здесь, если версия приложения или сборка не установлена, что приведет к сбою, если вы попытаетесь использовать ! разворачивать.
public var appVersionNumberString: String {
get {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
}
вот обновленная версия для 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)"
}
}
SWIFT 4
/ / сначала получите nsObject, определив как необязательный AnyObject
let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
/ / затем просто приведите объект в виде строки, но будьте осторожны, вы можете дважды проверить nil
let version = nsObject as! String
для тех, кто заинтересован, есть хорошая и аккуратная библиотека SwifterSwift
имеющиеся у github а также полностью документировано для каждой версии swift (см. swifterswift.com).
используя эту библиотеку, чтение версии приложения и номер сборки будет так же просто, как это:
import SwifterSwift
let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion
на 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