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?
Antworten:
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.quelle
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.
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 .
quelle
201606070620
in einer versendenden iOS-App.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 Script
Panel:Shell
Feld an:/bin/sh
Show environment variables in build log
Kontrollkästchen.Run script only when installing
Kontrollkästchen.Bei jedem Build wird die aktuelle Datums- und Uhrzeitangabe in der UTC- Zeitzone erfasst. Das
-u
Flag 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.Oder machen Sie einen Hybrid mit einer konventionellen
1.2.3
Versionsnummer und einer Datums- / Uhrzeit als Build-Nummer. Um den Hybrid zu machen, kommentieren Sie einfach dieCFBundleShortVersionString
Zeile mit einem#
vor.quelle
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 (dhCFBundleVersion
) 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.Aus dem technischen Hinweis TN2420: Versionsnummern und Build-Nummern .
quelle
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.
quelle
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.
quelle
Ab sofort die Apple-Dokumentation für
CFBundleVersion
Staaten [Schwerpunkt Mine]:Für
CFBundleShortVersionString
[Hervorhebung von mir]:Ich würde vorschlagen, nur automatisch
CFBundleVersion
für jeden Build (oder jede Version von TestFlight) zu erhöhen und ihn bei jeder Änderung auf 0 zurückzusetzenCFBundleShortVersionString
.Sie sollten explizit planen oder ein konsistentes Mittel entwickeln, um die vom Benutzer sichtbare Version in zu aktualisieren
CFBundleShortVersionString
.quelle