Jak moja aplikacja na iPhone'a może wykryć swój własny numer wersji?

254

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?

Brad Larson
źródło
1
Odpowiedź na to pytanie jest już dostępna tutaj stackoverflow.com/a/16888788/2890157 .
Akshat Singhal
1
.. powiązane pytanie jest 4 lata później, więc prawdziwym problemem jest to, że cmos nigdy nie zaakceptował odpowiedzi. Niezależnie od tego przydatne są odpowiedzi na powiązane pytanie, podobnie jak tutaj. W obu wątkach spójrz poza pierwszą odpowiedź - czasem w późniejszej odpowiedzi jest więcej aktualnych informacji.
ToolmakerSteve

Odpowiedzi:

222

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)”.

Brad Larson
źródło
152
To zwróciło moją wersję kompilacji, więc użyłem tej. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner
6
CFBundleVersion jest niepoprawny, ponieważ Xcode błędnie zapełnia ten wpis plist numerem kompilacji, a nie numerem wersji. jspooner jest poprawny.
Oscar
4
Zobacz stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4, aby uzyskać doskonałe wyjaśnienie numerów wersji vs wersji. Potwierdza, że CFBundleShortVersionStringto, czego normalnie byś chciał dla „wersji” i CFBundleVersionnumeru kompilacji.
Rory
3
kRevisionNumber nie działa dla mnie. Aby uzyskać dane wyjściowe, zrobiłem to (używając poprawki @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam
147

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.

idStar
źródło
59

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:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
źródło
42

Tak zrobiłem w mojej aplikacji

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Mam nadzieję, że ta prosta odpowiedź pomoże komuś ...

Arkady
źródło
1
Na moje potrzeby jest to świetne. Dzięki. +1
David DelMonte
1
Zwraca to
@chancyWu, CFBundleShortVersionString wydaje się dawać wersję.
Brian F Leighty
30

Są dwie rzeczy - wersja kompilacji i wersja aplikacji.

  1. Aby uzyskać wersję aplikacji:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Aby uzyskać wersję kompilacji:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Shaik Riyaz
źródło
Czy jest jakaś różnica między tymi dwoma? Obaj zwracają to samo dla mnie.
jjnevis
tak, może być twój numer kompilacji i wersja aplikacji są takie same w ustawieniach.
Shaik Riyaz
Ok, mam tylko jedno ustawienie w moim RAKEFILE - app.version (używam RubyMotion). Myślę, że albo zrobi to dla moich potrzeb. Dzięki
jjnevis,
Dzięki stary. Działał płynnie.
Felipe
1
FYI Lepiej jest użyć objectForInfoDictionaryKey:zamiast tego, infoDictionary] objectForKey:ponieważ pierwszy zwraca zlokalizowaną wartość (jeśli taka istnieje). Prawdopodobnie nie zrobi to jednak różnicy;)
dziekanWombourne
17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
John Erck
źródło
1
Dokładnie to, czego potrzebowałem!
Julius
16

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"];
rodamn
źródło
7

Możesz spróbować użyć słownika jako: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Abhishek Verma
źródło
4

Przeczytaj plik info.plist swojej aplikacji i uzyskaj wartość dla klucza CFBundleShortVersionString. Czytanie info.plist da ci obiekt NSDictionary

lostInTransit
źródło
4

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)"
}
rajat chauhan
źródło
3

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

dengST30
źródło
1

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! Stringkoniec na końcu linii appVersionlub buildNum, aby uzyskać tylko tę część jako Stringobiekt. Nie potrzebujesz tego jednak, jeśli szukasz pełnego versionInfo.

Mam nadzieję, że to pomoże!

Jeehut
źródło
1
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.

apex39
źródło
0

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”.

RedFilter
źródło
0

Możesz wypróbować tę metodę:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
BatyrCan
źródło