Odpowiedzi:
Istnieją 2 liczby!
Numer wersji marketingowej jest przeznaczony dla klientów, nazywany numerem wersji . Zaczyna się od wersji 1.0 i przechodzi do głównych aktualizacji do 2.0 , 3.0 , do drobnych aktualizacji do 1.1 , 1.2 i do poprawek błędów do 1.0.1 , 1.0.2 . Liczba ta dotyczy wersji i nowych funkcji. Nie musi kończyć się na 9, 1.11.23 to rozsądny numer wersji.
Numer kompilacji jest głównie wewnętrzny numer buduje , które zostały wykonane do tej pory. Ale niektórzy używają innych liczb, takich jak numer gałęzi repozytorium lub jego numer zatwierdzenia. Ta liczba powinna być unikatowa, aby rozróżnić różne kompilacje, które mają tylko niewielkie przyrostowe zmiany.
Cel C:
NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
Szybki <3,0:
let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
Swift 3.0+ (testowany z 5.0):
let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
Cel C:
NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
Szybki <3,0:
let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Swift 3.0+ (testowany do 5.0):
let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Najpierw użyj powyższych wierszy, a następnie następnego.
Cel C:
NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];
Swift (testowany do 5.0):
let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"
Wartości w pakiecie głównym nie zawsze są obecne, na przykład w aplikacji wiersza poleceń nie ma CFBundleShortVersionString
lub CFBundleVersion
, więc metody zwrócą nil
i ulegną awarii, ponieważ w kodzie tworzy niepoprawny downcast. Ale w zwykłych aplikacjach Cocoa iOS i Mac te wartości są zdefiniowane i nie zostaną usunięte.
Jest to testowane z Xcode w wersji 7.3 (7D175) . Numer kompilacji jest często zapisywany w nawiasach / nawiasach klamrowych. Numer kompilacji jest szesnastkowy lub dziesiętny.
W Xcode możesz automatycznie zwiększać numer kompilacji jako liczbę dziesiętną , umieszczając następujące elementy w Run script
fazie kompilacji w ustawieniach projektu
#!/bin/bash
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
Dla numeru kompilacji szesnastkowej użyj tego skryptu
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"
Dla Xcode
wykonaj następujące czynności:
Bundle.main.object(forInfoDictionaryKey: "...")
teraz.
Nie musisz niczego zmieniać w swoim projekcie ani w Xcode. Oto wersja Swift dla obu osobno:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Jest zawarte w tym repozytorium, sprawdź to:
Bundle.main.object(forInfoDictionaryKey: "...")
teraz.
Tutaj ten sam kod dla Swift 3 :
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Bundle.main
miał infoDictionary
dla mnie pusty ; może dlatego, że robię to w ramach, a nie w pliku wykonywalnym lub aplikacji? Bundle(for: MyClass.self)
zawiera oczekiwane wartości.
Programowe wyświetlanie wersji i numeru kompilacji - 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) )"
Możesz również użyć like
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))"
}
Następnie możesz użyć dowolnego miejsca, gdy deklarujesz globalnie.
print(appVersion)
Wynik:
Version: #1.0 (#1.0.3)
Zrobiłem rozszerzenie dla Bundle, więc będzie łatwe w użyciu
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")"
}
}