Wersja vs budować w Xcode

Mam aplikację, którą opracowałem z Xcode 3, a ostatnio zacząłem edytować z Xcode 4. W podsumowaniu celu mam formularz docelowy aplikacji iOS z polami: identyfikator, Wersja, kompilacja, urządzenia i cel wdrożenia. Pole wersja jest puste, a pole kompilacji jest 3.4.0 (co pasuje do wersji aplikacji z czasów, gdy jeszcze edytowałem Xcode 3).

Moje pytania to:

  1. Jaka jest różnica między wersją A budową pola?

  2. Dlaczego pole wersji było puste po uaktualnieniu do Xcode 4?

 611
Author: Cœur, 2011-07-28

7 answers

Apple jakby przearanżował / przestawił pola.

Idąc dalej, jeśli spojrzysz na zakładkę Informacje Dla celu aplikacji, powinieneś użyć "ciąg wersji pakietu, krótki" jako swojej wersji (np. 3.4.0) i "wersja pakietu" jako swojej kompilacji (np. 500 lub 1A500). Jeśli nie widzisz ich obu, możesz je dodać. Będą one mapować do odpowiedniej wersji i budować pola tekstowe na karcie Podsumowanie; są to te same wartości.

Podczas przeglądania karty Info, jeśli klikniesz prawym przyciskiem myszy i wybierzesz Pokaż surowe Klucze / wartości , zobaczysz rzeczywiste nazwy CFBundleShortVersionString (Version) i CFBundleVersion (Build).

Wersja jest zwykle używana tak, jak wygląda na to, że używasz jej z Xcode 3. Nie jestem pewien, na jakim poziomie pytasz o różnicę w wersji/budowie, więc odpowiem filozoficznie.

Istnieją różnego rodzaju schematy, ale popularny jest:

{MajorVersion}.{MinorVersion}.{Revision}

  • wersja główna - Główne zmiany, przeprojektowania i funkcjonalność zmiany
  • Wersja Minor - drobne ulepszenia, dodatki do funkcjonalności
  • Revision - numer patcha do poprawek błędów

Następnie Kompilacja jest używana oddzielnie, aby wskazać całkowitą liczbę kompilacji dla wydania lub dla całego cyklu życia produktu.

Wielu programistów zaczyna numer kompilacji od 0 i za każdym razem, gdy budują, zwiększają liczbę o jeden, zwiększając ją na zawsze. W moich projektach mam skrypt, który automatycznie zwiększa liczbę kompilacji za każdym razem, gdy buduję. Zobacz instrukcje poniżej.

  • Wersja 1.0.0 może być build 542. Potrzeba było 542 budów, aby dostać się do Wydanie 1.0.0.
  • Wersja 1.0.1 może być build 578.
  • Wersja 1.1.0 może być build 694.
  • Wersja 2.0.0 może być build 949.

Inni deweloperzy, w tym Apple, mają numer kompilacji składający się z głównej wersji + podrzędnej wersji + numer kompilacji dla wydania. Są to rzeczywiste numery wersji oprogramowania, w przeciwieństwie do wartości używanych do celów marketingowych.

Jeśli przejdziesz do Xcode menu > Informacje o Xcode, zobaczysz numery wersji i kompilacji. Jeśli trafisz więcej informacji... przycisk zobaczysz kilka różnych wersji. Od więcej informacji... przycisk został usunięty w Xcode 5, informacje te są również dostępne w sekcji Software > Developer aplikacji System Information , dostępne po otwarciu Apple menu > o tym Macu > raport systemu....

Na przykład Xcode 4.2 (4C139). Wersja marketingowa 4.2 to build major version 4, build minor version C I Build number 139. Następne wydanie (prawdopodobnie 4.3) będzie kompilacją release 4D, a Numer kompilacji rozpocznie się od 0 i zwiększy od tego momentu.

Numery wersji symulatora iPhone 'a / Build są takie same, jak iPhone' y, Mac ' y, itd.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

Aktualizacja: na żądanie, oto kroki, aby utworzyć skrypt, który działa za każdym razem budować swoją aplikację w Xcode, aby odczytać numer kompilacji, zwiększyć go i zapisać go z powrotem do pliku {App}-Info.plist aplikacji. Istnieją Opcjonalne, dodatkowe kroki, jeśli chcesz zapisać numery wersji / kompilacji do pliku(ów) Settings.bundle/Root*.plist.

To jest rozszerzone z artykułu how-to tutaj .

W Xcode 4.2-5.0:

  1. załaduj swój projekt Xcode.
  2. w lewym okienku kliknij swój projekt na samej górze hierarchii. Spowoduje to załadowanie edytora ustawień projektu.
  3. po lewej stronie panelu środkowego okna kliknij swoją aplikację pod nagłówkiem TARGETS . Musisz skonfigurować tę konfigurację dla każdego celu projektu.
  4. Wybierz fazy budowania tab.
    • w Xcode 4 W prawym dolnym rogu kliknij przycisk Dodaj fazę budowania i wybierz Dodaj Run Script .
    • w Xcode 5 Wybierz Editor menu > Dodaj fazę budowania > Dodaj Run Script Build Phase .
  5. przeciągnij i upuść nowy Uruchom skrypt Faza, aby przenieść go do tuż przed Kopiuj zasoby pakietu Faza (gdy aplikacja-info.plik plist zostanie dołączony do Twojej aplikacji).
  6. W Nowa Run Script phase, set Shell: /bin/bash.
  7. Skopiuj i wklej do obszaru skryptu dla liczb całkowitych:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
    
    [[22]}Jak zauważył @Bdebeez, Apple Generic Versioning Tool (agvtool) jest również dostępna. Jeśli wolisz używać go zamiast tego, jest kilka rzeczy, które musisz najpierw zmienić: {]}
    • wybierz zakładkę Build Settings .
    • w sekcji wersjonowanie Ustaw bieżąca wersja projektu do początkowego numeru kompilacji, którego chcesz użyć, np., 1.
    • wróć do zakładki fazy budowania , przeciągnij i upuść Uruchom skrypt po fazie Copy Bundle Resources , aby uniknąć warunków Wyścigu podczas próby zarówno zbudowania, jak i aktualizacji pliku źródłowego zawierającego numer kompilacji.

    Zauważ, że dzięki metodzie agvtool możesz okresowo otrzymywać nieudane/anulowane Kompilacje bez błędów. Na z tego powodu nie polecam używania agvtool z tym skryptem.

    Niemniej jednak, w fazie Uruchom skrypt, możesz użyć następującego skryptu:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all
    

    Argument next-version zwiększa numer kompilacji (bump jest również aliasem dla tej samej rzeczy), a -all aktualizuje Info.plist z nowym numerem kompilacji.

  8. A jeśli masz pakiet ustawień, w którym pokazujesz wersję i kompilację, możesz dodać następujące elementy na końcu skryptu, aby zaktualizować wersja i budowa. Uwaga: zmień wartości PreferenceSpecifiers, aby pasowały do Twoich ustawień. PreferenceSpecifiers:2 oznacza spojrzenie na pozycję w indeksie 2 pod tablicą PreferenceSpecifiers w pliku plist, więc dla indeksu opartego na 0 jest to trzecie ustawienie preferencji w tablicy.

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    

    Jeśli używasz agvtool zamiast bezpośrednio czytać Info.plist, możesz zamiast tego dodać następujący skrypt:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    
  9. A jeśli masz uniwersalną aplikację na iPada i iPhone ' a, możesz również ustawić ustawienia dla pliku iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist
    
 1159
Author: nekno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-29 22:31:38

(zostawiam to tutaj dla mojego własnego odniesienia.) Wyświetli wersję i kompilację dla pól "version" I "build", które widzisz w Xcode docelowym:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

In Swift

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}
 71
Author: Dan Rosenstark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 21:03:11

Numer kompilacji to wewnętrzny numer, który wskazuje aktualny stan aplikacji. Różni się od numeru wersji tym, że zazwyczaj nie jest skierowany do użytkownika i nie oznacza żadnej różnicy / funkcji/uaktualnień, jak numer wersji Zwykle.

Pomyśl o tym tak:

  • Build (CFBundleVersion): Numer kompilacji. Zwykle zaczynasz od 1 i zwiększasz o 1 przy każdej kompilacji aplikacji. Szybko pozwala na porównanie, który build jest nowszy i to oznacza poczucie postępu kodu. Mogą one być niezwykle cenne podczas pracy z QA i konieczności upewnienia się, że błędy są rejestrowane w odpowiednich kompilacjach.
  • Wersja marketingowa (CFBundleShortVersionString): Numer użytkownika, którego używasz do oznaczania tej wersji aplikacji. Zazwyczaj następuje to po Major.MyAwesomeApp 1.2), aby poinformować użytkowników, które Wydania są mniejszymi aktualizacjami konserwacyjnymi, a które są dużymi nowymi funkcjami.

Aby użyć tego skutecznie w twoich projektach, Apple zapewnia świetne narzędzie o nazwie agvtool. Gorąco polecam korzystanie z tego, ponieważ jest to o wiele prostsze niż tworzenie skryptów zmian plist. pozwala łatwo ustawić zarówno numer kompilacji, jak i wersję marketingową. Jest to szczególnie przydatne podczas tworzenia skryptów (na przykład, łatwe aktualizowanie numeru kompilacji przy każdym kompilacji lub nawet zapytywanie, jaki jest aktualny numer kompilacji). Może nawet robić bardziej egzotyczne rzeczy, takie jak oznaczanie SVN za ciebie po aktualizacji kompilacji numer.

Aby go użyć:

  • Ustaw swój projekt w Xcode, pod wersjonowanie, aby używać "Apple Generic".
  • w terminalu
    • agvtool new-version 1 (Ustaw numer kompilacji na 1)
    • agvtool new-marketing-version 1.0 (Ustaw wersję marketingową na 1.0)

Na stronie man agvtool znajdziesz mnóstwo dobrych informacji

 48
Author: Bdebeez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-23 12:44:02

Skrypt do autoincrementowania numeru kompilacji w odpowiedzi powyżej nie działał dla mnie, jeśli numer kompilacji jest wartością zmiennoprzecinkową, więc trochę go zmodyfikowałem:

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
 25
Author: ale84,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 15:47:10

Numer wydania marketingowego jest przeznaczony dla klientów, zwany numerem wersji . Zaczyna się od 1.0 i idzie do głównych aktualizacji do 2.0, 3.0, dla drobnych aktualizacji do 1.1, 1.2 oraz za poprawki błędów do 1.0.1, 1.0.2 . Ten numer jest zorientowany na Wydania i nowe funkcje.

Numer kompilacji jest w większości wewnętrzną liczbą kompilacji , które zostały wykonane do tego czasu. Ale niektóre użyj innych numerów, takich jak numer gałęzi repozytorium. Liczba ta powinna być unikalna , aby odróżnić różne prawie te same budowle.

Jak widzisz, numer kompilacji nie jest konieczny i to od Ciebie zależy, jakiego numeru kompilacji chcesz użyć. Jeśli więc zaktualizujesz Xcode do wersji głównej, pole build jest puste. Pole version może nie być puste!.


Aby uzyskać zbuduj liczbę jako NSString zmienna:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Aby otrzymać numer w wersji jako zmienną NSString:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Jeśli chcesz zarówno W Jednym NSString:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Jest to testowane z Xcode w wersji 4.6.3 (4H1503). Numer budowy jest często zapisywany w nawiasach / nawiasach. Numer kompilacji jest szesnastkowy lub dziesiętny.

buildandversion


W Xcode Możesz automatycznie zwiększyć liczbę zbudowaną jako liczbę dziesiętną , umieszczając następnie w fazie budowania Run script 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 liczby 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"

project_settings

 21
Author: Binarian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-28 07:33:56

Dzięki @nekno i @ale84 za świetne odpowiedzi.

Jednak zmodyfikowałem skrypt @ ale84, aby niewiele zwiększyć liczby kompilacji dla zmiennoprzecinkowych.

Wartość incl może zostać zmieniona zgodnie z Twoimi wymaganiami dotyczącymi formatu pływającego. Dla NP: jeżeli incl=.01, format wyjściowy byłby ... 1.19, 1.20, 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
 6
Author: iHS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-02 08:14:07

Innym sposobem jest ustawienie numeru wersji w appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application         didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}
 1
Author: mark VanderWiele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-17 15:05:51