Piszę aplikację na iPhone'a. Jest już opublikowany, ale chciałbym dodać funkcję, w której wyświetlany jest jego numer wersji.
Wolałbym nie robić tego ręcznie z każdą wydaną wersją ...
Czy w celu C można znaleźć wersję mojej aplikacji?
Piszę aplikację na iPhone'a. Jest już opublikowany, ale chciałbym dodać funkcję, w której wyświetlany jest jego numer wersji.
Wolałbym nie robić tego ręcznie z każdą wydaną wersją ...
Czy w celu C można znaleźć wersję mojej aplikacji?
Odpowiedzi:
Jak tu opisuję , używam skryptu do przepisania pliku nagłówka z moim bieżącym numerem wersji Subversion. Ten numer wersji jest przechowywany w stałej kRevisionNumber. Następnie mogę uzyskać dostęp do wersji i numeru wersji, używając czegoś podobnego do następującego:
[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]
który utworzy ciąg formatu „Wersja 1.0 (51)”.
CFBundleShortVersionString
to, czego normalnie byś chciał dla „wersji” i CFBundleVersion
numeru kompilacji.
[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Opierając się na odpowiedzi Brada Larsona, jeśli masz dużą i mniejszą wersję informacji przechowywaną w liście informacji (tak jak to zrobiłem w przypadku konkretnego projektu), to działało dobrze dla mnie:
- (NSString *)appNameAndVersionNumberDisplayString {
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];
return [NSString stringWithFormat:@"%@, Version %@ (%@)",
appDisplayName, majorVersion, minorVersion];
}
Teraz ręczne przeglądanie mniejszej wersji może być uciążliwe, dlatego użycie sztuczki polegającej na zmianie numeru repozytorium jest idealne. Jeśli tego nie zrobiłeś (tak jak ja nie), powyższy fragment może być przydatny. Wyciąga także nazwę wyświetlaną aplikacji.
Wersja Swift dla obu osobno:
Szybki 3
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
Swift 2
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
Zawiera się w tym repozytorium, sprawdź to:
Tak zrobiłem w mojej aplikacji
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Mam nadzieję, że ta prosta odpowiedź pomoże komuś ...
Możesz określić CFBundleShortVersionString
ciąg w swojej plist.info i odczytać go programowo za pomocą dostarczonego interfejsu API .
Są dwie rzeczy - wersja kompilacji i wersja aplikacji.
Aby uzyskać wersję aplikacji:
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Aby uzyskać wersję kompilacji:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
objectForInfoDictionaryKey:
zamiast tego, infoDictionary] objectForKey:
ponieważ pierwszy zwraca zlokalizowaną wartość (jeśli taka istnieje). Prawdopodobnie nie zrobi to jednak różnicy;)
Zwięzłym sposobem uzyskania ciągu wersji w formacie XYZ jest:
[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]
Lub tylko dla XY:
[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]
Oba te fragmenty zwracają ciągi, które można przypisać do właściwości tekstowej obiektu etykiety, np
myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
Możesz spróbować użyć słownika jako: -
NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];
NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Przeczytaj plik info.plist swojej aplikacji i uzyskaj wartość dla klucza CFBundleShortVersionString. Czytanie info.plist da ci obiekt NSDictionary
Możesz użyć infoDictionary, który pobiera szczegółowe informacje o wersji z info.plist Twojej aplikacji. Ten kod działa w trybie szybkim 3. Wystarczy wywołać tę metodę i wyświetlić wersję w dowolnym preferowanym elemencie interfejsu użytkownika.
Swift-3
func getVersion() -> String {
let dictionary = Bundle.main.infoDictionary!
let version = dictionary["CFBundleShortVersionString"] as! String
let build = dictionary["CFBundleVersion"] as! String
return "v\(version).\(build)"
}
Swift 5:
Istnieją dwie rzeczy - wersja aplikacji i wersja kompilacji
Aby uzyskać wersję aplikacji:
if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
// present appVersion
}
Aby uzyskać wersję kompilacji:
if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
// present buildVersion
}
Dzięki @Brad Larson♦
dużo
Jeśli potrzebujesz kombinacji obu wersji i numeru kompilacji , oto krótka droga z użyciem Swift 3 :
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"
Dodaj as! String
koniec na końcu linii appVersion
lub buildNum
, aby uzyskać tylko tę część jako String
obiekt. Nie potrzebujesz tego jednak, jeśli szukasz pełnego versionInfo
.
Mam nadzieję, że to pomoże!
func getAppVersion() -> String {
let dictionary = Bundle.main.infoDictionary!
let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
let buildValue = dictionary["CFBundleVersion"] ?? "0"
return "\(versionValue) (build \(buildValue))"
}
Na podstawie odpowiedzi @rajat chauhan bez wymuszonego obsady String
.
Dobrze jest poradzić sobie z systemem kontroli wersji. W ten sposób, gdy otrzymasz raport o błędzie od użytkownika, możesz sprawdzić tę wersję kodu i (mam nadzieję) odtworzyć błąd z dokładnie tym samym kodem co użytkownik.
Chodzi o to, że za każdym razem, gdy robisz kompilację, uruchamiasz skrypt, który pobiera bieżący numer wersji twojego kodu i aktualizuje plik w twoim projekcie (zwykle z pewną formą wymiany tokena). Następnie możesz napisać procedurę obsługi błędów, która zawsze zawiera numer wersji na wyjściu błędu, lub możesz wyświetlić go na stronie „Informacje”.