Как получить версию приложения и номер сборки с помощью Swift?

У меня есть приложение IOS с контентом Azure и вы хотите зарегистрировать определенные события, например, логины и версии пользователей приложения.

Как я могу вернуть версию и построить номер с помощью Swift?

Ответ 1

РЕДАКТИРОВАТЬ

Обновлено для 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

Я надеюсь, что это помогает вам.

Дэвид

Ответ 2

Я знаю, что это уже ответили, но лично я думаю, что это немного чище:

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 равны нулю, необязательная разворачивание приведет к пропуску кода.

Ответ 3

Обновлено для 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

Ответ 4

Я также знаю, что на это уже ответили, но я обернул предыдущие ответы:

(*) Обновлено для расширений

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()

Ответ 5

Для Swift 4.0

let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!

Ответ 6

Я сделал расширение на пачке

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))"

Ответ 7

Для 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.

Ответ 8

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
    }
}

Ответ 9

Xcode 8, Swift 3:

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

Ответ 10

Мой ответ (по состоянию на август 2015 года), учитывая, что Swift продолжает развиваться:

let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String

Ответ 11

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))"
    }
}

Ответ 12

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

Ответ 13

Посмотрев документацию, я считаю, что следующее является более чистым:

let version = 
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") 
as? String

Источник: "Использование этого метода предпочтительнее других методов доступа, потому что оно возвращает локализованное значение ключа, когда оно доступно".

Ответ 14

Для Swift 1.2 это:

let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String

Ответ 15

Swift 3:

Номер версии

if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }

Номер сборки

if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }

Ответ 16

Swift 4

func getAppVersion() -> String {
    return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}

Bundle.main.infoDictionary! [ "CFBundleShortVersionString" ]

Быстрое синтаксис

let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]

Ответ 17

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
    }

}

Внимание: Вы должны использовать, если позволить здесь, если версия приложения или сборка не установлены, что приведет к сбою, если вы попытаетесь использовать! развернуть.

Ответ 18

public var appVersionNumberString: String {
get {
    return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
}

Ответ 19

Здесь обновленная версия для 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)"
    }
}

Ответ 20

SWIFT 4

//Сначала получаем nsObject, определяя как необязательный AnyObject

let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject

//Затем просто приведем объект в виде String, но будьте осторожны, вы можете перепроверить ноль

let version = nsObject as! String

Ответ 21

для тех, кто заинтересован, есть хорошая и аккуратная библиотека SwifterSwift доступная на github, а также полностью документированная для каждой версии swift (см. swifterswift.com).

Используя эту библиотеку, читать версию приложения и номер сборки так же просто, как это:

import SwifterSwift

let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion

Ответ 22

if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        lblVersion.text = "Version \(version)"

    }

Ответ 23

Обновление для Swift 5

здесь функция, которую я использую, чтобы решить, показывать ли страницу "приложение обновлено" или нет. Он возвращает номер сборки, который я преобразую в 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, который меньше текущего номера сборки. Чтобы не показывать такой экран новым пользователям, просто добавьте номер сборки после первого входа в систему или после завершения регистрации.

Ответ 24

Теперь вы можете использовать константу для этого, вместо того, чтобы использовать строковый код, как раньше, что делает вещи еще более удобными.

var appVersion: String {
    return Bundle.main.infoDictionary![kCFBundleVersionKey as String] as! String
}

Ответ 25

ОП запросил как номер версии, так и номер сборки. К сожалению, большинство ответов не предоставляют оба этих варианта. Кроме того, другие добавляют ненужные методы расширения. Вот тот, который довольно прост и решает проблему ОП:

// 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 ""
  }
}

Ответ 26

Простая служебная функция для возврата версии приложения как 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
    }

Ответ 27

Для 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

Ответ 28

Для Swift 5.0:

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String