У меня есть приложение IOS с контентом Azure и вы хотите зарегистрировать определенные события, например, логины и версии пользователей приложения.
Как я могу вернуть версию и построить номер с помощью Swift?
У меня есть приложение 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 равны нулю, необязательная разворачивание приведет к пропуску кода.
Обновлено для 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()
Для Swift 4.0
let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!
Я сделал расширение на пачке
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 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 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
}
}
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
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))"
}
}
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
Посмотрев документацию, я считаю, что следующее является более чистым:
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"] ?? "")"
}
Bundle.main.infoDictionary! [ "CFBundleShortVersionString" ]
Быстрое синтаксис
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
//Затем просто приведем объект в виде String, но будьте осторожны, вы можете перепроверить ноль
let version = nsObject as! String
для тех, кто заинтересован, есть хорошая и аккуратная библиотека SwifterSwift
доступная на github, а также полностью документированная для каждой версии swift (см. swifterswift.com).
Используя эту библиотеку, читать версию приложения и номер сборки так же просто, как это:
import SwifterSwift
let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
lblVersion.text = "Version \(version)"
}
здесь функция, которую я использую, чтобы решить, показывать ли страницу "приложение обновлено" или нет. Он возвращает номер сборки, который я преобразую в Int:
if let version: String = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
guard let intVersion = Int(version) else { return }
if UserDefaults.standard.integer(forKey: "lastVersion") < intVersion {
print("need to show popup")
} else {
print("Don't need to show popup")
}
UserDefaults.standard.set(intVersion, forKey: "lastVersion")
}
Если никогда не использовался раньше, он вернет 0, который меньше текущего номера сборки. Чтобы не показывать такой экран новым пользователям, просто добавьте номер сборки после первого входа в систему или после завершения регистрации.
Теперь вы можете использовать константу для этого, вместо того, чтобы использовать строковый код, как раньше, что делает вещи еще более удобными.
var appVersion: String {
return Bundle.main.infoDictionary![kCFBundleVersionKey as String] as! String
}
ОП запросил как номер версии, так и номер сборки. К сожалению, большинство ответов не предоставляют оба этих варианта. Кроме того, другие добавляют ненужные методы расширения. Вот тот, который довольно прост и решает проблему ОП:
// Example output: "1.0 (234)"
private func versionAndBuildNumber() -> String {
let versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
if let versionNumber = versionNumber, let buildNumber = buildNumber {
return "\(versionNumber) (\(buildNumber))"
} else if let versionNumber = versionNumber {
return versionNumber
} else if let buildNumber = buildNumber {
return buildNumber
} else {
return ""
}
}
Простая служебная функция для возврата версии приложения как Int
func getAppVersion() -> Int {
if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
let appVersionClean = appVersion.replacingOccurrences(of: ".", with: "", options: NSString.CompareOptions.literal, range:nil)
if let appVersionNum = Int(appVersionClean) {
return appVersionNum
}
}
return 0
}
Для 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
Для Swift 5.0:
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String