2015-05-25 8 views
9

otrzymałem następującą wiadomość e-mail od firmy Apple, kiedy przedstawia aktualizację aplikacji:Zastosowanie tego samego CFBundleVersion i CFBundleShortVersionString we wszystkich celach

odkryliśmy jeden lub więcej problemów z ostatniej dostawy „projekt”. Twoja dostawa był udany, ale można chcą poprawić następujące problemy w następnej dostawy:

CFBundleVersion Niezgodność - Wartość CFBundleVersion „1” „z rozszerzeniem Project.app/PlugIns/ProjectTodayExtension.appex” does nie należy dopasować do wartości CFBundleVersion '985' jej aplikacji iOS "Project.app".

CFBundleShortVersionString Niezgodność - The CFBundleShortVersionString wartość '1,0' z rozszerzeniem 'Project.app/PlugIns/ProjectTodayExtension.appex' nie odpowiadać wartości CFBundleShortVersionString '2.1.6' swojej aplikacji zawierającej iOS „Project. aplikacja ".

Po rozwiązaniu problemów można użyć programu ładującego Xcode lub aplikacji , aby przesłać nowy plik binarny do programu iTunes Connect.

Czy istnieje jakiś sposób korzystać z tego samego CFBundleVersion i CFBundleShortVersionString we wszystkich celów, aby temu zapobiec?

Odpowiedz

6

Moje rozwiązanie to:

Dla CFBundleShortVersionString:

  • dodać użytkownika zdefiniowane stałe w projekcie ustawień

Add a user-defined constant in your **project** settings

  • name it $ (CF_BUNDLE_SHORT_VERSION_STRING) i ustawić go do żądanej wartości

enter image description here

  • ustawić swoją wersję w swoich celów do $ (CF_BUNDLE_SHORT_VERSION_STRING)

enter image description here

  • Powtórz dla wszystkich celów. Wykonane!

CFBundleVersion: można zrobić to samo dla CFBundleVersion, ale jakoś chciałem tę wartość należy obliczyć z moich repo git commit liczyć. Ive zrobić to tak:

  • Dodaj wstępnie działanie do główny cel. Dostęp pokazany dialogowe poprzez Produkt> Schematu> Edycja Programu

  • Dodaj post-akcję do główny cel.

enter image description here

  • Dodaj nowy cel narzędzie wiersza polecenia o nazwie BundleVersionUpdate i jeden o nazwie BundleVersionRevert

enter image description here

  • Przejdź do Twój nowy BundleVersionUpdate cel i dodać nowy skrypt Run Budowanie Phase

enter image description here

  • Wklej następujący
\#!/bin/sh 

INFOPLIST="${SRCROOT}/MyApp/MyApp-Info.plist" 
INFOPLIST_WKAPP="${SRCROOT}/MyApp-WKApp/Info.plist" 
INFOPLIST_WKEXT="${SRCROOT}/MyApp-WKExt/Info.plist" 

PLISTCMD="Set :CFBundleVersion $(git rev-list --all|wc -l)" 

echo -n "$INFOPLIST" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" 

echo -n "$INFOPLIST_WKAPP" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" 

echo -n "$INFOPLIST_WKEXT" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" 
  • Nawiguj do nowego BundleVersionRevert cel i dodać nowy skrypt Run Budowanie Phase i wklej to:
\#!/bin/sh 

INFOPLIST="${SRCROOT}/MyApp/MyApp-Info.plist" 
INFOPLIST_WKAPP="${SRCROOT}/MyApp-WKApp/Info.plist" 
INFOPLIST_WKEXT="${SRCROOT}/MyApp-WKExt/Info.plist" 

PLISTCMD="Set :CFBundleVersion SCRIPTED" 

echo -n "$INFOPLIST" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" 

echo -n "$INFOPLIST_WKAPP" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" 

echo -n "$INFOPLIST_WKEXT" 
| xargs -0 /usr/libexec/PlistBuddy -c "$PLISTCMD" 
  • Zapraszamy!
3

Wersja twojego projektu ProjectTodayExtension.appex musi być taka sama jak Twoja aplikacja. Przykład:

docelowa> Ogólne:

Wersja: 1.0 < - zmiana tutaj Biuld: 1,0

Jeśli wersja aplikacji, aby dostać się na iTunes Connect 2.3, wówczas należy zmienić wersję Twój TodayExtension do tej samej wersji 2.3.

+2

Wiem, jak rozwiązać ten błąd. Pytam, czy istnieje sposób na synchronizację wersji/kompilacji między celami. – jherran

+0

Spójrz na moją nową odpowiedź. – stk

5

Akcje schematu nie znajdują się pod kontrolą źródła, dlatego lepiej dodać fazę kompilacji do celu aplikacji. Synchronizowania wersje we wszystkich celów może być rozwiązany za pomocą prostego skryptu, który może być modyfikowany na każdy cel, który ma być synchronizacja:

  1. Add „New Run Script Faza” w „Zbuduj faz” za cel swojej aplikacji

enter image description here

  1. zmienić nazwę skryptu coś w "Sync wykonania" i przeciągnąć ją nad "Źródła kompilacji "(UWAGA: Xcode zawiera błąd, który może uniemożliwić działanie funkcji przeciągania i upuszczania. Jeśli tak, to musisz ręcznie edytować plik .pbxproj więc faza build idzie we właściwym miejscu

  2. wklej następujący skrypt w powłoce:

    INFOPLIST_MYAPP="${SRCROOT}/MyApp/MyApp-Info.plist" 
    myAppVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_MYAPP") 
    myAppBuild=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_MYAPP") 
    
    INFOPLIST_SHAREEXT="${SRCROOT}/ShareExtension/Info.plist" 
    /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $myAppVersion" "$INFOPLIST_SHAREEXT" 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $myAppBuild" "$INFOPLIST_SHAREEXT" 
    

enter image description here

  1. Twórz swój projekt w normalny sposób, a wersja rozszerzenia udziału w wersji & pozostanie zsynchronizowana z głównym celem.
+0

Pamiętaj, że musisz tutaj wpisać własną ścieżkę: '" $ {SRCROOT} /MyApp/MyApp-Info.plist "' a tu '" $ {SRCROOT} /ShareExtension/Info.plist "'. –

0

Podczas próby sprawdzenia poprawności mojego archiwum został wyświetlony komunikat o błędzie Brak CFBundleShortVersionString. Aby rozwiązać ten problem poszedłem do Info.plist w kodzie XML i dodaną CFBundleShortVersionString nowy numer wersji Ten wyprodukowany w formacie plist wersji Bundle ciąg, krótki to rozwiązać mój problem

0

Jest naprawdę słodki wersja systemu zarządzania którą Twitch udostępnił.

opisanych w niniejszym blog post, jest nieco podobny do stk zaakceptował answer ale czystsze, a także obsługuje następujące:

  • Krawaty numer kompilacji bezpośrednio (i odwracalnie) do git commit przed kompilacji. Wróć z powrotem do dokładnej wersji stworzonej do użytku z raportem o awarii.

  • Obsługuje generowanie wersji poprzez zależność docelową, którą łatwiej udostępniać w wielu celach.

  • Wykorzystuje preprocesor C w funkcji Info.plist wbudowanej w ustawienia kompilacji Xcode, aby umożliwić zamianę numerów wersji w locie, bez modyfikacji pliku Info.plist.

Jest nieco bardziej skomplikowany do wdrożenia, ale jest to najlepsze rozwiązanie, które znalazłem, szczególnie jeśli masz rozszerzenia lub inne obiekty docelowe, których wersje muszą być zsynchronizowane.

instalacji Uwagi: Note blog ma wielkie zadanie opisania cztery pliki powłoki, ale tak naprawdę nie dać instrukcje instalacji lub konfiguracji. Oto co zrobiłem:

  1. Utwórz podkatalog Wersje na najwyższym poziomie projektu (gdzie mieszka .xcodeproj).

  2. Pobierz cztery pliki wskazane z linku do opisu w lewym dolnym rogu próbek kodu. Przenieś cztery pliki do swojego katalogu wersji.

  3. Korzystanie z terminalu, cd do katalogu wersje, a następnie wykonać polecenie cmd: chmod +x * do plików wykonywalnych powłoki

  4. Teraz postępuj zgodnie ze wskazówkami w blogu od początku stworzyć swój cel zależnościach.

  5. Prawdopodobnie należy nieco dostosować skrypty. Zmieniłem nazwę i refaktoryzację, aby przenieść 4 narzędzia do osobnego katalogu narzędzi, który udostępniam w projektach. YMMV.