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?


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


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.


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


42

Tak zrobiłem w mojej aplikacji

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

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


1
Na moje potrzeby jest to świetne. Dzięki. +1
David DelMonte


@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"];

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"];

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"];

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]

4

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


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)"
}

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


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!


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.


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


0

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

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.