Jakich wartości należy użyć dla CFBundleVersion i CFBundleShortVersionString?


98

To jest moje pierwsze zgłoszenie aplikacji na iOS i nie chcę, aby moja aplikacja została odrzucona.

To pochodzi z Apple Docs:

CFBundleVersion (String - iOS, OS X) określa numer wersji kompilacji pakietu, który identyfikuje iterację (wydaną lub niewydaną) pakietu. Numer wersji kompilacji powinien być ciągiem składającym się z trzech nieujemnych liczb całkowitych oddzielonych kropkami, przy czym pierwsza liczba całkowita jest większa od zera. Ciąg powinien zawierać tylko cyfry (0-9) i kropki (.). Zera wiodące są obcinane z każdej liczby całkowitej i zostaną zignorowane (to znaczy 1.02.3 jest równoważne 1.2.3). Tego klucza nie można zlokalizować.

CFBundleShortVersionString (String - iOS, OS X) określa numer wersji pakietu, który identyfikuje wydaną iterację aplikacji. Numer wersji wydania to ciąg składający się z trzech liczb całkowitych oddzielonych kropkami. Pierwsza liczba całkowita reprezentuje główne wersje aplikacji, takie jak wersje, które wprowadzają nowe funkcje lub duże zmiany. Druga liczba całkowita oznacza wersje, które zawierają mniej widoczne funkcje. Trzecia liczba całkowita reprezentuje wydania konserwacyjne.

Wartość tego klucza różni się od wartości „CFBundleVersion”, która identyfikuje iterację (wydaną lub niewydaną) aplikacji. Ten klucz można zlokalizować, dołączając go do plików InfoPlist.strings.

Ale wydaje się to trochę dziwne. Moja interpretacja jest taka, że ​​obie wartości są takie same, tj .:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Czy ktoś może potwierdzić w 100%, że tak mam umieścić?


1
Zgodnie z tym CFBundleShortVersionString można zlokalizować. Ale jeśli muszą to być trzy liczby całkowite oddzielone kropkami, jaka lokalizacja jest możliwa?
Rick

@Rick Przypuszczam, że oznacza to, że możesz przekonwertować go na języki, które faktycznie mają różne cyfry, takie jak arabski?
shiser

@shiser Mówiąc pedantycznie, „cyfry arabskie” to w rzeczywistości cyfry, których używamy w zachodnim świecie, a także w większości innych miejsc. Ale rozumiem, co masz na myśli, i są takie części świata arabskiego, które nie używają „cyfr arabskich”. en.wikipedia.org/wiki/Arabic_numerals
RenniePet

1
Tutaj jest kolejna odpowiedź. stackoverflow.com/q/21125159/419348
AechoLiu

Odpowiedzi:


77

Pomyśl o tym w ten sposób: „Wersja skrócona” ( CFBundleShortVersionString) to publiczny numer wersji. „Wersja” ( CFBundleVersion) jest raczej wewnętrznym numerem wersji, który może zmieniać się znacznie częściej niż publiczna „skrócona wersja”. Osobiście używam tego samego w obu przypadkach, ale wiele osób aktualizuje „wersję” w każdej kompilacji. Tak czy inaczej, zazwyczaj aktualizujesz „wersję skróconą” po wydaniu dla Apple. Częstotliwość aktualizacji „wersji” zależy od Ciebie i Twoich potrzeb.


14
Należy pamiętać, że wersja pakietu (CFBundleVersion) musi liczbowo przekraczać wersję pakietu Twojej poprzedniej aplikacji, w przeciwnym razie podczas przesyłania do App Store wystąpi błąd. Zobacz stackoverflow.com/questions/4933093/… .
Phil

3
Podobnie jak Phil mówi powyżej, w dzisiejszych czasach, jeśli ponownie prześlesz nieudaną (niezatwierdzoną przez App Store) wersję , wygląda na to, że musisz teraz podbijać CFBundleVersion przy każdym zgłoszeniu , więc prawdopodobnie te liczby będą się różnić, chyba że zawsze będziesz doskonały, lub nie masz nic przeciwko wbijaniu swojej publicznej (CFBundleShortVersionString) wersji # po jakiejkolwiek zmianie potrzebnej do pomyślnego przesłania do App Store.
likethesky

106

CFBundleShortVersionString podaje wersję Twojej aplikacji. Jest on zwykle zwiększany za każdym razem, gdy publikujesz aplikację w App Store. To jest wersja, która jest widoczna w sekcji „Wersja” na stronie App Store Twojej aplikacji.

CFBundleVersion podaje numer kompilacji, który jest używany do programowania i testowania, a mianowicie do celów „technicznych”. Użytkownik końcowy rzadko jest zainteresowany numerem kompilacji, ale podczas programowania może być konieczne poznanie, co jest opracowywane i poprawiane w każdej kompilacji. Jest to zwykle zwiększane przy każdej iteracji wydania wewnętrznego. Możesz też użyć narzędzi ciągłej integracji, takich jak Jenkins, aby automatycznie zwiększać numer kompilacji w każdej kompilacji.

Numery wersji i kompilacji

Te dwie liczby nie zależą od siebie, ale warto zachować je równolegle, aby uniknąć nieporozumień. Pamiętaj, że gdy Twoja aplikacja przejdzie recenzję w App Store, musisz zwiększyć numer kompilacji, tak jak stwierdzili Phil i like TheSky, niezależnie od tego, czy ją opublikujesz, czy nie.

Przykład zastosowania: powiedzmy, że masz dobrze przetestowaną wersję, gotową do przesłania. Numer wersji to 1.0.0, a numer kompilacji to 1.0.0.32 . Po przesłaniu aplikacji musisz zaktualizować wersję na 1.0.1 i numer kompilacji na 1.0.1.0 .


4
Czy więc można bezpiecznie zignorować ten fragment w dokumentach (cytowany w pytaniu), że CFBundleVersion jest „ trzema ” wartościami oddzielonymi kropkami ?
big_m

Myślę, że to zależy od ciebie. Jeśli nie publikujesz wydania często lub nie musisz ściśle przestrzegać poprawek błędów przez częste cykle testowe; równie dobrze możesz użyć 3 cyfr dla obu z nich.
Yunus Nedim Mehel

więc czy CFBundleVersion może mieć wartość 0 dla kompilacji sklepu z aplikacjami? Czy Apple to odrzuci?
kraftydevil

3
Tak, możesz użyć wartości innych niż 3 cyfry ze znakami interpunkcyjnymi. Użyłem wartości daty i godziny, takiej jak 201606070620w wysyłkowej aplikacji na iOS.
Basil Bourque

3
@BasilBourque, jeśli nie zastosujesz się do wytycznych, możesz napotkać problem, jeśli korzystasz z zakupów w aplikacji. Patrz nota techniczna 2413
DanSkeel,

16

Odpowiedź przez rmaddy jest poprawna. Dodam jeszcze dwie myśli.

Numer trzeciej wersji

Pamiętaj o trzecim numerze wersji podanym w witrynie internetowej iTunesConnect jako część definicji aplikacji. Jeśli ta liczba jest inna niż dwie w Xcode, Apple wyświetla ostrzeżenie. Możesz zignorować ostrzeżenie, ponieważ nie jest to blokada pokazu (nie jest to „błąd”).

Data-godzina jako wersja

Nie musisz też używać trzech cyfr ze znakami interpunkcyjnymi. Może to mieć sens w przypadku niektórych aplikacji, w których tradycyjnie zmiany w pierwszej liczbie wskazywały na jakąś dramatyczną zmianę zwykle wpływającą na kompatybilność.

W przypadku innych aplikacji możesz chcieć użyć po prostu wartości daty i godziny w standardowym formacie ISO 8601 (RRRRMMDDGGMM). Na przykład 201606070620. Ta kolejność rok-miesiąc-data-godzina-minuta tworzy stale rosnącą liczbę, zawsze o tej samej długości ze względu na wypełnienie zerami, która po posortowaniu alfabetycznym jest również chronologiczna.

Z powodzeniem użyłem tego stylu numerów wersji w dostarczanej aplikacji na iOS działającej w iOS 7, 8 i 9.

Możesz nawet zautomatyzować generowanie tej wartości. W projekcie za Target> Build Phases> Run Scriptpanelu:

  1. Podaj w Shellpolu:/bin/sh
  2. Wklej następujący 5-liniowy skrypt widoczny poniżej.
  3. (opcjonalnie) Zaznacz pole Show environment variables in build logwyboru.
  4. Usuń zaznaczenie Run script only when installingpola wyboru.

Za każdym razem, gdy tworzysz kompilację, zapisywana jest bieżąca data i godzina w strefie czasowej UTC . -uFlag w skrypcie wykorzystuje UTC zamiast aktualnej domyślną strefę czasową. Generalnie najlepsze dla programistów i administratorów systemów jest używanie i myślenie w UTC, a nie w lokalnych strefach czasowych.

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

Lub zrób hybrydę, ze standardowym 1.2.3numerem wersji i datą i godziną jako numerem kompilacji. Aby wykonać hybrydę, po prostu zakomentuj CFBundleShortVersionStringwiersz z #przednim.


8

Najbardziej sensownym dla mnie schematem jest użycie numeru wersji (tj. CFBundleShortVersionString) Jako rzeczywistego numeru wersji, a następnie użycie numeru kompilacji (tj. CFBundleVersion) Do przedstawienia przesłania do App Store. Tak więc, o ile nie ma żadnych problemów i nie zostanie ponownie przesłanych, ta liczba zawsze wynosi 1. W przypadku nowej wersji resetuję do 1, jeśli poprzednia miała problemy podczas testów TestFlight lub przeglądu.

Numery kompilacji umożliwiają nadanie nazwy każdemu zgłoszeniu, które podajesz dla określonego wydania. Jak opisano w powyższych definicjach, zbiór wszystkich kompilacji, które udostępniasz dla określonej wersji aplikacji, jest nazywany „pociągiem do wydania” tej wersji. W przypadku aplikacji na iOS numery kompilacji muszą być niepowtarzalne w każdym pociągu wydań, ale nie muszą być unikalne w różnych pociągach wydań [wyróżnienie moje]. Oznacza to, że w przypadku aplikacji na iOS możesz ponownie użyć tych samych numerów kompilacji w różnych pociągach wydań, jeśli chcesz.

Z uwagi technicznej TN2420: Numery wersji i numery kompilacji .


1
Dobrze widzieć odpowiedź, która zawiera oficjalne odniesienie potwierdzające interpretacje przedstawione w innych odpowiedziach na tej stronie.
user2067021

6

Używam CFBundleVersion, aby wskazać wewnętrzną kompilację dla CFBundleShortVersionString . Używam lotu testowego do przesyłania kompilacji dla moich testerów, więc różnica między nimi jest niezwykle przydatna.

Dokumenty Apple mówią, że CFBundleVersion „powinien być ciągiem składającym się z 3 nieujemnych liczb całkowitych oddzielonych kropkami”. W rzeczywistości może to być WIĘCEJ NIŻ 3 części (jak pokazuje powyższa odpowiedź). Używam tego do wskazania mojej kompilacji programistycznej, powiedzmy, że moja CFBundleShortVersionString to 1.0.0, mogę użyć 1.0.0.11 dla CFBundleVersion, aby wskazać, że jest to moja 11. kompilacja dla wydania 1.0.0

Każda wersja CFBundleVersion przesłana do sklepu z aplikacjami powinna być większa niż poprzednio, w przeciwnym razie otrzymasz ERROR ITMS-90478 : „Invalid Version. inny numer wersji ”.

CFBundleShortVersionString może mieć tylko 3 części, w przeciwnym razie zostanie wyświetlony BŁĄD ITMS-90060: Wartość klucza CFBundleShortVersionString 'xxx' w pliku Info.plist musi być listą rozdzielaną kropkami, składającą się maksymalnie z trzech nieujemnych liczb całkowitych. "

3-ci Numer że Basil Bourque wspomniano, czyli numer wersji pokazach na iTunesConnect gdzie rzeczy mogą się komplikują.

Używam innego numeru iTunesConnect niż CFBundleShortVersionString, ponieważ kiedy po raz pierwszy przesłałem moją aplikację do sklepu z aplikacjami, mamy już wiele rund wewnętrznych wydań. Więc użyłem 1.0 dla numeru iTunesConnect i 5.x dla CFBundleShortVersionString. W następnym wydaniu do sklepu z aplikacjami zapewniłem funkcję sprawdzania, czy w sklepie z aplikacjami jest nowsza wersja i zdałem sobie sprawę, że mam teraz problem, ponieważ mogę uzyskać tylko numer iTunesConnect (używając http://itunes.apple.com/lookup?bundleId=), więc przed porównaniem muszę wykonać pewne obliczenia z numerem CFBundleShortVersionString.

Próbowałem to naprawić, używając numeru iTunesConnect jako mojego CFBundleShortVersionString, ale otrzymałem błąd ERROR ITMS-90062 : „Ten pakiet jest nieprawidłowy. Wartość klucza CFBundleShortVersionString [xxx] w pliku Info.plist musi zawierać wyższą wersję niż ta poprzednio zatwierdzonej wersji [xxx]. "

Dlatego zasugeruję, aby zawsze były takie same.


5

Coś, czego nigdzie nie widziałem, to jaka jest maksymalna liczba dla każdego pola w CFBundleVersion?

Ustawiając CFBundleVersion w aplikacji na 1.1.1 i patrząc na szesnastkową wartość wersji w „lsregister -dump”, ustaliłem, że maksymalna wartość pierwszego pola to (2 ^ 22) -1 lub 4194303, a maksymalna wartości w drugim i trzecim polu to (2 ^ 21) -1 lub 2097151.

Te 3 pola sumują się do 64 bitów.

Ma to konsekwencje dla tych z nas, którzy używają CFBundleVersion w oparciu o datę i godzinę.

Ustawiałem pierwsze pole na RRRRMMDD. Jest to zawsze większe niż maksymalne dozwolone wersje i prowadziło do nieprzewidywalnych rezultatów, delikatnie mówiąc, gdy Launch Services decydowało, którą wersję aplikacji uruchomić, gdy masz zainstalowanych wiele wersji i używasz czegoś takiego jak `` open -a Appname 'z wiersza poleceń.

Proszę, rozpowszechnij to szeroko. Jestem pewien, że wielu ludziom się to nie udaje.


Czy przypominasz sobie, co się dzieje, gdy dodaje się czwarte pole (1.1.1.20191201) i czego używasz zamiast tego? Naprawdę chciałbym, żeby Apple użył tej samej wartości liczbowej, którą zrobił tutaj Android. PS dzięki za sprawdzenie tego!
nurek kosmiczny

Uważam, że ograniczenie jest tutaj udokumentowane i jest nieco bardziej restrykcyjne niż to, o czym tu wspomniano.
saagarjha

3

Obecnie dokumentacja Apple dotyczącaCFBundleVersion stanów [wyróżnienie moje]:

Wersja kompilacji, która identyfikuje iterację pakietu.

...

Ten klucz to odczytywalny maszynowo ciąg składający się z jednej do trzech liczb całkowitych oddzielonych kropkami, na przykład 10.14.1. Ciąg może zawierać tylko znaki numeryczne (0–9) i kropki.

...

Możesz dołączyć więcej liczb całkowitych, ale system je ignoruje.

Dla CFBundleShortVersionString[podkreślenia moje]:

Numer wydania lub wersji pakietu.

...

Ten klucz jest ciągiem znaków widocznym dla użytkownika dla wersji pakietu. Wymagany format to trzy liczby całkowite oddzielone kropkami, na przykład 10.14.1. Ciąg może zawierać tylko znaki numeryczne (0–9) i kropki.

Sugerowałbym po prostu automatyczne zwiększanie wartości CFBundleVersiondla każdej kompilacji (lub każdej wersji do TestFlight) i resetowanie go do 0 za każdym razem, gdy zmienisz CFBundleShortVersionString.

Należy wyraźnie zaplanować lub opracować spójne sposoby aktualizowania wersji widocznej dla użytkownika w programie 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.