Ответы:
Есть 2 номера!
Номер маркетинговой версии для клиентов называется номером версии . Он начинается с 1.0 и подходит для основных обновлений до 2.0 , 3.0 , для небольших обновлений до 1.1 , 1.2 и для исправлений ошибок до 1.0.1 , 1.0.2 . Этот номер ориентирован на релизы и новые функции. Не нужно останавливаться на 9, 1.11.23 - это разумный номер версии.
Номер сборки - это в основном внутреннее количество сборок , которые были сделаны до этого. Но некоторые используют другие числа, такие как номер ветки хранилища или номер его коммита. Это число должно быть уникальным, чтобы различать различные сборки, которые имеют только незначительные дополнительные изменения.
Objective-C:
NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
Свифт <3.0:
let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
Swift 3.0+ (протестировано с 5.0):
let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
Objective-C:
NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
Свифт <3.0:
let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Swift 3.0+ (тестируется до 5.0):
let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Сначала используйте вышеуказанные строки, а затем следующую.
Objective-C:
NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];
Swift (проверено до 5.0):
let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"
Значения в основном пакете не всегда присутствуют, например, в приложении командной строки нет CFBundleShortVersionString
или CFBundleVersion
, поэтому методы будут возвращаться, nil
и он будет аварийно завершать работу, поскольку в коде он делает неправильное снижение. Но в обычных приложениях Cocoa для iOS и Mac эти значения определены и не будут удалены.
Это проверено с версией 7.3 Xcode (7D175) . Номер сборки часто пишется в скобках / скобках. Номер сборки в шестнадцатеричном или десятичном виде.
В Xcode вы можете автоматически увеличивать номер сборки в виде десятичного числа , помещая следующее в Run script
фазу сборки в настройках проекта
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
Для шестнадцатеричного номера сборки используйте этот скрипт
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber))
buildNumber=$(($buildNumber + 1))
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
Для Xcode
сделать следующее:
Bundle.main.object(forInfoDictionaryKey: "...")
сейчас.
Вам не нужно ничего менять в вашем проекте или Xcode. Вот версия Swift для обоих по отдельности:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Это включено в этот репо, проверьте это:
Bundle.main.object(forInfoDictionaryKey: "...")
сейчас.
Вот тот же код для Swift 3 :
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Bundle.main
был пустой infoDictionary
для меня; может потому, что я делаю это изнутри фреймворка, а не из исполняемого файла или приложения? Bundle(for: MyClass.self)
содержит ожидаемые значения.
Программно отобразить версию и номер сборки - Swift 4.0
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"
let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Вы также можете использовать как
var appVersion: String {
//versionNumber
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"
//buildNumber
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"
return "Version: #\(versionNumber) (#\(buildNumber))"
}
Тогда вы можете использовать где угодно, когда вы объявляете глобально.
print(appVersion)
Вывод:
Version: #1.0 (#1.0.3)
Я сделал расширение для Bundle, чтобы им было легко пользоваться
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
var applicationName: String {
return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
}
var applicationReleaseDate: String {
return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
}
var applicationReleaseNumber: Int {
return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
}
var releaseVersionNumberPretty: String {
return "\(releaseVersionNumber ?? "1.0.0")"
}
var buildVersionNumberPretty: String {
return "\(buildVersionNumber ?? "1")"
}
}