У меня есть приложение IOS с контентом Azure и вы хотите зарегистрировать определенные события, например, логины и версии пользователей приложения.
Как я могу вернуть версию и построить номер с помощью Swift?
РЕДАКТИРОВАТЬ
Обновлено для 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 < 2,3
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
Таким образом, если версия allow заботится об условной обработке (установка текста меток в моем случае), и если infoDictionary или CFBundleShortVersionString равны нулю, необязательная разворачивание приведет к пропуску кода.
self.labelVersion.text
является необязательным типом, поэтому вы можете напрямую назначить NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
Обновлено для Swift 3.0
NS
-prefixes теперь исчезли в Swift 3.0, и несколько свойств/методов изменили имена на более Swifty. Вот как это выглядит сейчас:
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
}
Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber
Старый обновленный ответ
Я работаю с Frameworks со своего первоначального ответа, поэтому я хотел обновить мое решение до чего-то более простого и гораздо полезнее в среде с несколькими связями:
extension NSBundle { var releaseVersionNumber: String? { return self.infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return self.infoDictionary?["CFBundleVersion"] as? String } }
Теперь это расширение будет полезно в приложениях для определения как основного пучок и любые другие входящие в комплект комплекты (например, общие рамки для программирование расширения или третьи рамки, такие как 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
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()
Я сделал расширение на пачке
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" - это номер build, введенный в Xcode по общему → Identity.
Xcode 8, Swift 3:
let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"
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
}
}
Мой ответ (по состоянию на август 2015 года), учитывая, что Swift продолжает развиваться:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
Посмотрев документацию, я считаю, что следующее является более чистым:
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, полезное расширение для Bundle
import Foundation
public extension Bundle {
public var shortVersion: String {
if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
return result
} else {
assert(false)
return ""
}
}
public var buildVersion: String {
if let result = infoDictionary?["CFBundleVersion"] as? String {
return result
} else {
assert(false)
return ""
}
}
public var fullVersion: String {
return "\(shortVersion)(\(buildVersion))"
}
}
Swift 4
func getAppVersion() -> String {
return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}
Bundle.main.infoDictionary! [ "CFBundleShortVersionString" ]
Быстрое синтаксис
let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
public var appVersionNumberString: String {
get {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
}
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
}
}
Внимание: Вы должны использовать, если позволить здесь, если версия приложения или сборка не установлены, что приведет к сбою, если вы попытаетесь использовать! развернуть.
Bundle + Extensions.swift
import Foundation
extension Bundle {
var versionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
var bundleName: String? {
return infoDictionary?["CFBundleName"] as? String
}
}
Использование:
someLabel.text = Bundle.main.versionNumber
для тех, кто заинтересован, есть хорошая и аккуратная библиотека SwifterSwift
доступная на github, а также полностью документированная для каждой версии swift (см. swifterswift.com).
Используя эту библиотеку, читать версию приложения и номер сборки так же просто, как это:
import SwifterSwift
let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion
SWIFT 4
//Сначала получаем nsObject, определяя как необязательный AnyObject
let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
//Затем просто приведем объект в виде String, но будьте осторожны, вы можете перепроверить ноль
let version = nsObject 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 2.0
//First get the nsObject by defining as an optional anyObject
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
let version = nsObject as! String