Welche Werte sollte ich für CFBundleVersion und CFBundleShortVersionString verwenden?

98

Dies ist meine erste iOS-App-Einreichung und ich möchte nicht, dass meine App abgelehnt wird.

Dies ist aus den Apple Docs:

CFBundleVersion (String - iOS, OS X) gibt die Build-Versionsnummer des Bundles an, die eine Iteration (freigegeben oder unveröffentlicht) des Bundles identifiziert. Die Build-Versionsnummer sollte eine Zeichenfolge sein, die aus drei nicht negativen, durch Perioden getrennten Ganzzahlen besteht, wobei die erste Ganzzahl größer als Null ist. Die Zeichenfolge sollte nur numerische (0-9) und Punktzeichen (.) Enthalten. Führende Nullen werden von jeder Ganzzahl abgeschnitten und ignoriert (dh 1.02.3 entspricht 1.2.3). Dieser Schlüssel ist nicht lokalisierbar.

CFBundleShortVersionString (String - iOS, OS X) gibt die Versionsnummer des Bundles an, die eine freigegebene Iteration der App identifiziert. Die Versionsnummer der Version ist eine Zeichenfolge, die aus drei durch Punkte getrennten Ganzzahlen besteht. Die erste Ganzzahl repräsentiert wichtige Revisionen der App, z. B. Revisionen, die neue Funktionen implementieren, oder wichtige Änderungen. Die zweite Ganzzahl bezeichnet Revisionen, die weniger wichtige Funktionen implementieren. Die dritte Ganzzahl steht für Wartungsversionen.

Der Wert für diesen Schlüssel unterscheidet sich vom Wert für "CFBundleVersion", der eine Iteration (freigegeben oder unveröffentlicht) der App identifiziert. Dieser Schlüssel kann lokalisiert werden, indem er in Ihre InfoPlist.strings-Dateien aufgenommen wird.

Aber es scheint ein bisschen seltsam. Meine Interpretation hierfür ist, beide Werte gleich zu setzen, dh:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Kann jemand 100% bestätigen, was ich sagen soll?

Bbx
quelle
1
Demnach kann CFBundleShortVersionString lokalisiert werden. Aber wenn es drei durch Punkte getrennte ganze Zahlen sein müssen, welche Lokalisierung ist möglich?
Rick
@ Rick Ich nehme an, das bedeutet, dass Sie es für Sprachen konvertieren können, die tatsächlich unterschiedliche Ziffern haben, wie Arabisch?
Shiser
@shiser Um pedantisch zu sein, sind "arabische Ziffern" eigentlich die Ziffern, die wir in der westlichen Welt und an den meisten anderen Orten verwenden. Aber ich verstehe, was Sie meinen, und es gibt einige Teile der arabischen Welt, die keine "arabischen Ziffern" verwenden. en.wikipedia.org/wiki/Arabic_numerals
RenniePet
1
Eine andere Antwort hier. stackoverflow.com/q/21125159/419348
AechoLiu

Antworten:

77

Stellen Sie sich das so vor: Die "Kurzversion" ( CFBundleShortVersionString) ist die öffentliche Versionsnummer. Die "version" ( CFBundleVersion) ist eher eine interne Versionsnummer, die sich weitaus häufiger ändern kann als die öffentliche "Kurzversion". Persönlich verwende ich das gleiche für beide, aber viele Leute aktualisieren die "Version" bei jedem Build. In beiden Fällen aktualisieren Sie normalerweise die "Kurzversion", wenn Sie sie auf Apple veröffentlichen. Wie oft Sie die "Version" aktualisieren, hängt von Ihnen und Ihren Anforderungen ab.

rmaddy
quelle
14
Beachten Sie, dass die Bundle-Version (CFBundleVersion) die Bundle-Version Ihrer vorherigen App numerisch überschreiten muss. Andernfalls wird beim Senden an den App Store ein Fehler angezeigt. Siehe stackoverflow.com/questions/4933093/… .
Phil
3
Ähnlich wie Phil sagt oben, heute, wenn Sie erneut ein ausgefallenes (nicht genehmigt durch App Store) zu bauen, es sieht aus wie Sie die CFBundleVersion auf jeder Vorlage stoßen müssen jetzt , so wahrscheinlich diese Zahlen abweichen , es sei denn Sie sind immer perfekt, oder es macht Ihnen nichts aus, Ihre öffentliche Version (CFBundleShortVersionString) bei Änderungen zu ändern, die für eine erfolgreiche Übermittlung an den App Store erforderlich sind.
likethesky
106

Mit CFBundleShortVersionString erhalten Sie die Version Ihrer App. Sie wird normalerweise jedes Mal erhöht, wenn Sie Ihre App im App Store veröffentlichen. Dies ist die Version, die im Abschnitt "Version" für die App Store-Seite Ihrer Anwendung angezeigt wird.

CFBundleVersion gibt Ihnen die Build-Nummer, die für Entwicklung und Test verwendet wird, nämlich "technische" Zwecke. Der Endbenutzer ist selten an der Build-Nummer interessiert, aber während der Entwicklung müssen Sie möglicherweise wissen, was bei jedem Build entwickelt und behoben wird. Dies wird normalerweise bei jeder Iteration der internen Version erhöht. Und Sie können fortlaufende Integrationstools wie Jenkins verwenden, um die Build-Nummer für jeden Build automatisch zu erhöhen.

Versions- und Build-Nummern

Die beiden Zahlen hängen nicht voneinander ab, aber es ist eine gute Idee, sie parallel zu halten, um Verwirrung zu vermeiden. Beachten Sie, dass Sie nach bestandener App Store-Überprüfung die Build-Nummer erhöhen müssen, wie von Phil und likeTheSky angegeben, unabhängig davon, ob Sie sie veröffentlichen oder nicht.

Anwendungsfall: Angenommen, Sie haben einen gut getesteten Build, der zur Einreichung bereit ist. Die Versionsnummer ist 1.0.0 und die Build-Nummer ist 1.0.0.32 . Sobald Sie Ihre App eingereicht haben , müssen Sie die Version als 1.0.1 und die Build-Nummer als 1.0.1.0 aktualisieren .

Yunus Nedim Mehel
quelle
4
Ist es also sicher, dieses Bit in den Dokumenten (in der Frage zitiert) zu ignorieren, dass CFBundleVersion " drei " periodengetrennte Werte sind?
big_m
Ich denke, es liegt an dir. Wenn Sie eine Version nicht häufig veröffentlichen oder wenn Sie die Fehlerbehebungen nicht durch häufige Testzyklen genau befolgen müssen; Sie können auch 3 Ziffern für beide verwenden.
Yunus Nedim Mehel
Kann CFBundleVersion für einen App Store-Build 0 sein? Wird Apple es ablehnen?
Kraftydevil
3
Ja, Sie können andere Werte als 3 Zahlen mit Interpunktion verwenden. Ich habe einen Datums- / Uhrzeitwert verwendet, z. B. 201606070620in einer versendenden iOS-App.
Basil Bourque
3
@BasilBourque: Wenn Sie die Richtlinien nicht befolgen, kann es zu Problemen kommen, wenn Sie In-App-Käufe verwenden. Siehe Technischer Hinweis 2413
DanSkeel
16

Die Antwort von rmaddy ist richtig. Ich werde noch zwei Gedanken hinzufügen.

Dritte Versionsnummer

Beachten Sie die dritte Versionsnummer, die auf der iTunesConnect-Website als Teil der Definition Ihrer App angegeben ist. Wenn sich diese Nummer von den beiden in Xcode unterscheidet, gibt Apple eine Warnung aus. Sie können die Warnung ignorieren, da es sich nicht um einen Show-Stopper handelt (kein "Fehler").

Datum-Uhrzeit als Version

Außerdem müssen Sie keine drei Zahlen mit Interpunktion verwenden. Dies mag für einige Apps sinnvoll sein, bei denen Änderungen in der ersten Nummer traditionell auf eine dramatische Änderung hinweisen, die sich normalerweise auf die Kompatibilität auswirkt.

Für andere Apps möchten Sie möglicherweise einfach einen Datums- / Uhrzeitwert im Standardformatstil ISO 8601 (JJJJMMTTHHMM) verwenden. Zum Beispiel 201606070620. Diese Reihenfolge von Jahr, Monat, Datum, Stunde und Minute ergibt eine immer größere Zahl, die aufgrund des Auffüllens von Null immer dieselbe Länge hat und bei alphabetischer Sortierung auch chronologisch ist.

Ich habe diese Art von Versionsnummern erfolgreich in einer iOS-App verwendet, die unter iOS 7, 8 und 9 funktioniert.

Sie können sogar die Generierung dieses Werts automatisieren. In Ihrem Projekt Target> Build Phases> Run ScriptPanel:

  1. Geben Sie im ShellFeld an:/bin/sh
  2. Fügen Sie das folgende 5-Zeilen-Skript ein (siehe unten).
  3. (optional) Aktivieren Sie das Show environment variables in build logKontrollkästchen.
  4. Deaktivieren Sie das Run script only when installingKontrollkästchen.

Bei jedem Build wird die aktuelle Datums- und Uhrzeitangabe in der UTC- Zeitzone erfasst. Das -uFlag im Skript verwendet UTC anstelle Ihrer aktuellen Standardzeitzone. Im Allgemeinen ist es für Programmierer und Systemadministratoren am besten, UTC anstelle lokaler Zeitzonen zu verwenden und zu denken.

#!/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"

Oder machen Sie einen Hybrid mit einer konventionellen 1.2.3Versionsnummer und einer Datums- / Uhrzeit als Build-Nummer. Um den Hybrid zu machen, kommentieren Sie einfach die CFBundleShortVersionStringZeile mit einem #vor.

Basil Bourque
quelle
7

Das für mich sinnvollste Schema besteht darin, die Versionsnummer (dh CFBundleShortVersionString) für die tatsächliche Versionsnummer zu verwenden und dann die Build-Nummer (dh CFBundleVersion) zu verwenden, um die Übermittlung an den App Store darzustellen. Sofern es keine Probleme gibt und daher erneut eingereicht wird, ist diese Nummer immer 1. Bei einer neuen Version setze ich sie auf 1 zurück, wenn die vorherige Version Probleme beim Testen oder Überprüfen von TestFlight hatte.

Build-Nummern bieten eine Möglichkeit, die von Ihnen für eine bestimmte Version bereitgestellten Übermittlungen zu benennen. Wie in den obigen Definitionen beschrieben, wird die Sammlung aller Builds, die Sie für eine bestimmte Version Ihrer App bereitstellen, als "Release Train" dieser Version bezeichnet. Für iOS-Apps müssen Build-Nummern in jedem Release-Zug eindeutig sein, sie müssen jedoch nicht in verschiedenen Release-Zügen eindeutig sein [mein Schwerpunkt]. Das heißt, für iOS-Apps können Sie dieselben Build-Nummern in verschiedenen Release-Zügen wieder verwenden, wenn Sie möchten.

Aus dem technischen Hinweis TN2420: Versionsnummern und Build-Nummern .

Plindberg
quelle
1
Es ist gut, eine Antwort zu sehen, die eine offizielle Referenz enthält, die die Interpretationen bestätigt, die in anderen Antworten auf dieser Seite dargestellt sind.
user2067021
6

Ich verwende CFBundleVersion , um den internen Build für CFBundleShortVersionString anzugeben . Ich benutze Testflug, um Builds für meine Tester einzureichen, daher war der Unterschied zwischen ihnen äußerst nützlich.

Laut Apple-Dokumenten sollte CFBundleVersion "eine Zeichenfolge sein, die aus 3 nicht negativen, durch Perioden getrennten Ganzzahlen besteht". Tatsächlich kann es sich jedoch um MEHR ALS 3 Teile handeln (wie die obige Antwort zeigt). Ich benutze das, um meinen Entwicklungsbuild anzuzeigen, sagen wir, mein CFBundleShortVersionString ist 1.0.0, ich kann 1.0.0.11 für CFBundleVersion verwenden, um anzuzeigen, dass dies mein 11. Build für Release 1.0.0 ist

Jede CFBundleVersion, die an den App Store gesendet wird, sollte größer als zuvor sein. Andernfalls wird ERROR ITMS-90478 angezeigt : "Ungültige Version. Der Build mit der Version" xxx "kann nicht importiert werden, da eine spätere Version für neue Build-Einreichungen geschlossen wurde. Wählen Sie eine andere Versionsnummer. "

CFBundleShortVersionString kann nur aus 3 Teilen bestehen, sonst erhalten Sie den Fehler ITMS-90060: Der Wert für den Schlüssel CFBundleShortVersionString 'xxx' in der Datei Info.plist muss eine durch Perioden getrennte Liste von höchstens drei nicht negativen Ganzzahlen sein. "

Die dritte Nummer , die Basil Bourque erwähnt hat, dh die Versionsnummer, die auf iTunesConnect angezeigt wird, ist die Stelle, an der die Dinge kompliziert werden können.

Ich verwende eine andere iTunesConnect-Nummer als CFBundleShortVersionString, da wir bereits viele interne Releases veröffentlicht haben, als ich meine App zum ersten Mal im App Store eingereicht habe. Also habe ich 1.0 für die iTunesConnect-Nummer und 5.x für CFBundleShortVersionString verwendet. In der nächsten Version des App Store habe ich eine Funktion bereitgestellt, um zu überprüfen, ob es eine neuere Version im App Store gibt, und festgestellt, dass ich jetzt Probleme habe, da ich nur die iTunesConnect-Nummer (mit http://itunes.apple.com/lookup?bundleId=) abrufen kann, sodass ich vor dem Vergleich einige Berechnungen durchführen muss mit CFBundleShortVersionString Nummer.

Ich habe versucht, dies durch Verwendung der iTunesConnect-Nummer als CFBundleShortVersionString zu beheben, habe jedoch den Fehler ERROR ITMS-90062 erhalten : "Dieses Bundle ist ungültig. Der Wert für den Schlüssel CFBundleShortVersionString [xxx] in der Datei Info.plist muss eine höhere Version enthalten der zuvor genehmigten Version [xxx]. "

Deshalb werde ich vorschlagen, sie immer gleich zu machen.

Qiulang
quelle
5

Was ich noch nie besprochen habe, ist die maximale Anzahl für jedes Feld in einer CFBundleVersion.

Durch Setzen von CFBundleVersion in einer App auf 1.1.1 und Betrachten der hexadezimalen Vaue für die Version in "lsregister -dump" habe ich festgestellt, dass der Maximalwert für das erste Feld (2 ^ 22) -1 oder 4194303 und der Maximalwert ist Werte für das zweite und dritte Feld sind (2 ^ 21) -1 oder 2097151.

Die 3 Felder addieren sich zu 64 Bit.

Dies hat Auswirkungen auf diejenigen von uns, die CFBundleVersion basierend auf Datum und Uhrzeit verwenden.

Ich habe das erste Feld auf JJJJMMTT gesetzt. Dies ist immer größer als die maximal zulässigen Versionen und führte, gelinde gesagt, zu unvorhersehbaren Ergebnissen, als Launch Services entschied, welche Version einer App ausgeführt werden sollte, wenn Sie mehrere Versionen installiert hatten und so etwas wie "open -a Appname" verwendeten 'von der Kommandozeile.

Bitte verbreiten Sie dies weit. Ich bin sicher, dass viele Leute damit nicht weiterkommen.

Dave Evans
quelle
Erinnern Sie sich, was getan wird, wenn ein viertes Feld hinzugefügt wird (1.1.1.20191201) und was Sie stattdessen verwenden? Ich wünschte wirklich, Apple hätte nur den gleichen numerischen Wert verwendet, den Android hier verwendet hat. PS, danke, dass du nachgeschlagen hast!
Raumanzug
Ich glaube, die Einschränkung ist hier dokumentiert und etwas restriktiver als das, was hier erwähnt wird.
Saagarjha
3

Ab sofort die Apple-Dokumentation fürCFBundleVersion Staaten [Schwerpunkt Mine]:

Die Build-Version, die eine Iteration des Bundles identifiziert.

...

Dieser Schlüssel ist eine maschinenlesbare Zeichenfolge, die aus ein bis drei durch Perioden getrennten Ganzzahlen besteht , z. B. 10.14.1. Die Zeichenfolge darf nur numerische Zeichen (0-9) und Punkte enthalten.

...

Sie können mehr Ganzzahlen einschließen, aber das System ignoriert sie.

Für CFBundleShortVersionString[Hervorhebung von mir]:

Die Versions- oder Versionsnummer des Bundles.

...

Dieser Schlüssel ist eine vom Benutzer sichtbare Zeichenfolge für die Version des Bundles. Das erforderliche Format sind drei durch Perioden getrennte Ganzzahlen , z. B. 10.14.1. Die Zeichenfolge darf nur numerische Zeichen (0-9) und Punkte enthalten.

Ich würde vorschlagen, nur automatisch CFBundleVersionfür jeden Build (oder jede Version von TestFlight) zu erhöhen und ihn bei jeder Änderung auf 0 zurückzusetzen CFBundleShortVersionString.

Sie sollten explizit planen oder ein konsistentes Mittel entwickeln, um die vom Benutzer sichtbare Version in zu aktualisieren CFBundleShortVersionString.

Kenny Evitt
quelle