Jak uzyskać obecną wersję mojego projektu iOS w kodzie?
151
Chciałbym móc pobrać aktualną wersję mojego projektu / aplikacji na iOS jako NSStringobiekt bez konieczności definiowania gdzieś stałej w pliku. Nie chcę zmieniać wartości mojej wersji w 2 miejscach.
Wartość musi zostać zaktualizowana, gdy podbijam moją wersję w podsumowaniu celu projektu.
Możesz pobrać wersję i numery kompilacji w następujący sposób:
let version =Bundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")as!Stringlet build =Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey asString)as!String
lub w Objective-C
NSString* version =[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];NSString* build =[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString*)kCFBundleVersionKey];
Mam następujące metody w kategorii na UIApplication:
extension UIApplication{staticvar appVersion:String{returnBundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")as!String}staticvar appBuild:String{returnBundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey asString)as!String}staticvar versionBuild:String{let version = appVersion, build = appBuild
return version == build ?"v\(version)":"v\(version)(\(build))"}}
Możesz użyć tego [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] zamiast [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. Dawny wydaje się dobrze współgrać z [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. ]; Więc teraz stało się to łatwe do zapamiętania
Durai Amuthan.H
4
@Duraiamuthan Zalecam używanie (NSString *)kCFBundleVersionKeyzamiast @"CFBundleVersion". Mimo że wpisywanie jest dłuższe (pomoże tutaj autouzupełnianie), ponieważ jest to stała, która jest sprawdzana podczas kompilacji.
Ashley Mills
Przy okazji, dokładniejsze byłoby włączenie tego rozszerzenia NSBundlezamiast UIApplicationtego, co pozwoli również zastąpić statyczne wywołania instancją.
Zapko,
@Zapko - Z całym szacunkiem się nie zgadzam. Koncepcyjnie to pasuje UIApplication, ponieważ zwracane informacje dotyczą aplikacji. Dotyczy to również tylko mainpakietu - nie ma sensu traktować tej metody instancji w jakimkolwiek pakiecie.
Ashley Mills,
Czy chodziło Ci o to, buildkiedy powiedziałeś appBundle(w drugiej linii kodu)?
user1046037
14
Oto, co zadziałało w Xcode 8, Swift 3:
let gAppVersion =Bundle.main.object(forInfoDictionaryKey:"CFBundleShortVersionString")??"0"let gAppBuild =Bundle.main.object(forInfoDictionaryKey:"CFBundleVersion")??"0"print("Version: \(gAppVersion)")print("Build: \(gAppBuild)")
let info:NSDictionary=NSBundle.mainBundle().infoDictionary!let version:String= info.objectForKey("CFBundleShortVersionString")as!String
versionLabel.text ="Version:"+ version
Aby uzyskać zlokalizowaną wartość dowolnego klucza, należy użyć CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
let versionNumber =NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")as!Stringlet buildNumber =NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion")as!String
(NSString *)kCFBundleVersionKey
zamiast@"CFBundleVersion"
. Mimo że wpisywanie jest dłuższe (pomoże tutaj autouzupełnianie), ponieważ jest to stała, która jest sprawdzana podczas kompilacji.NSBundle
zamiastUIApplication
tego, co pozwoli również zastąpić statyczne wywołania instancją.UIApplication
, ponieważ zwracane informacje dotyczą aplikacji. Dotyczy to również tylkomain
pakietu - nie ma sensu traktować tej metody instancji w jakimkolwiek pakiecie.build
kiedy powiedziałeśappBundle
(w drugiej linii kodu)?Oto, co zadziałało w Xcode 8, Swift 3:
źródło
W celu C:
1) Aby uzyskać wersję aplikacji, musisz użyć:
2) Aby uzyskać wersję Build, musisz użyć:
źródło
W Swift możesz uzyskać wersję pakietu, używając:
źródło
Mój projekt open source, App Update Tracker , oferuje tę funkcjonalność (i nie tylko) w postaci metod klasowych:
+ (NSString *)getShortVersionString
+ (NSString *)getLongVersionString
Używałbyś tego w ten sposób:
źródło
Tylko dla notatki
Aby uzyskać zlokalizowaną wartość dowolnego klucza, należy użyć
CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)
źródło
Oto wersja Swift dla obu z nich osobno:
Jest uwzględniony w tym repozytorium, sprawdź to:
https://github.com/goktugyil/EZSwiftExtensions
źródło