Ce valori ar trebui să folosesc pentru CFBundleVersion și CFBundleShortVersionString? (Programare, Ios)

Bbx a intrebat.

Aceasta este prima mea aplicație iOS și nu vreau ca aplicația mea să fie respinsă.

Aceasta este din Apple Docs:

CFBundleVersion (String – iOS, OS X) specifică numărul versiunii de construcție a pachetului, care identifică o iterație (lansată sau nelansată) a pachetului. Numărul versiunii de construcție trebuie să fie un șir format din trei numere întregi nenegative, separate prin puncte, primul număr întreg fiind mai mare decât zero. Șirul trebuie să conțină numai caractere numerice (0-9) și puncte (.). Zerourile de început sunt trunchiate din fiecare număr întreg și vor fi ignorate (adică 1.02.3 este echivalent cu 1.2.3). Această cheie nu poate fi localizată.

CFBundleShortVersionString (String – iOS, OS X) specifică numărul versiunii de lansare a pachetului, care identifică o iterație lansată a aplicației. Numărul versiunii de lansare este un șir de caractere format din trei numere întregi separate prin puncte. Primul număr întreg reprezintă revizuirile majore ale aplicației, cum ar fi revizuirile care implementează caracteristici noi sau modificări majore. Al doilea număr întreg indică revizuirile care implementează caracteristici mai puțin importante. Al treilea număr întreg reprezintă versiunile de întreținere.

Valoarea pentru această cheie diferă de valoarea pentru „CFBundleVersion”, care identifică o iterație (lansată sau neeliberată) a aplicației. Această cheie poate fi localizată prin includerea ei în fișierele InfoPlist.strings.

Dar pare un pic ciudat. Interpretarea mea pentru acest lucru este de a pune ambele valori la fel, adică:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Poate cineva să confirme 100% că asta este ceea ce ar trebui să pun?

Comentarii

  • Conform acestui lucru, CFBundleShortVersionString poate fi localizat. Dar dacă trebuie să fie trei numere întregi separate prin puncte, ce localizare este posibilă? –  > Por Rick.
  • @Rick Presupun că asta înseamnă că poți să o convertești pentru limbile care au de fapt cifre diferite, cum ar fi araba? –  > Por shiser.
  • @shiser Doar pentru a fi pedant, „cifrele arabe” sunt de fapt cifrele pe care le folosim în lumea occidentală și în majoritatea celorlalte locuri. Dar înțeleg ce vrei să spui și există unele părți ale lumii arabe care nu folosesc „cifre arabe”. ro.wikipedia.org/wiki/Arabic_numerals –  > Por RenniePet.
  • Un alt răspuns aici. stackoverflow.com/q/2112515159/419348 –  > Por AechoLiu.
7 răspunsuri
rmaddy

Gândește-te la asta în felul următor: „Versiunea scurtă” (CFBundleShortVersionString) este numărul versiunii publice. „Versiunea” (CFBundleVersion) este mai degrabă un număr de versiune internă care se poate schimba mult mai frecvent decât „versiunea scurtă” publică. Personal, eu folosesc același număr pentru ambele, dar mulți oameni actualizează „versiunea” la fiecare construcție. În orice caz, actualizați de obicei „versiunea scurtă” atunci când o lansați către Apple. Cât de des actualizați „versiunea” depinde de dumneavoastră și de nevoile dumneavoastră.

Comentarii

    17

  • Rețineți că versiunea „bundle” (CFBundleVersion) trebuie să depășească numeric versiunea „bundle” a aplicației dvs. anterioare, altfel va primi o eroare la trimiterea către App Store. Consultați stackoverflow.com/questions/4933093/…. –  > Por Phil.
  • Similar cu ceea ce spune Phil mai sus, în zilele noastre, dacă retrimiteți un build eșuat (neaprobat de App Store), se pare că acum trebuie să măriți CFBundleVersion la fiecare trimitere, deci probabil că aceste numere vor fi divergente, cu excepția cazului în care sunteți întotdeauna perfect sau nu vă deranjează să măriți versiunea publică (CFBundleShortVersionString) # la orice modificare necesară pentru trimiterea cu succes la App Store. –  > Por likethesky.
Yunus Nedim Mehel

CFBundleShortVersionString vă oferă versiunea a aplicației dumneavoastră. De obicei, este incrementată de fiecare dată când vă publicați aplicația în App Store. Aceasta este versiunea care este vizibilă în secțiunea „Version” pentru pagina App Store a aplicației dumneavoastră.

CFBundleVersion vă oferă valoarea numărul de construcție care este utilizat pentru dezvoltare și testare, și anume în scopuri „tehnice”. Utilizatorul final este rareori interesat de numărul de construcție, dar în timpul dezvoltării este posibil să fie nevoie să știți ce se dezvoltă și ce se corectează la fiecare construcție. Acesta este de obicei incrementat la fiecare iterație a versiunii interne. Și puteți utiliza instrumente de integrare continuă, cum ar fi Jenkins, pentru a crește automat numărul de construcție la fiecare construcție.

Cele două numere nu depind unul de celălalt, dar este o idee bună să le păstrați în paralel pentru a evita confuziile. Rețineți că, odată ce aplicația dvs. a trecut de revizuirea App Store, trebuie să incrementați numărul de construcție, așa cum au afirmat Phil și likeTheSky, indiferent dacă o publicați sau nu.

Caz de utilizare: Să presupunem că aveți o versiune bine testată, gata de a fi trimisă. Numărul versiunii este 1.0.0 și numărul de construcție este 1.0.0.32. După ce vă trimiteți aplicația, trebuie să actualizați versiunea ca 1.0.1 și numărul de construcție ca fiind 1.0.1.0.

Comentarii

  • Așadar, este sigur să ignorăm acea parte din documentație (citată în întrebare) despre CFBundleVersion ca fiind „trei” valori separate prin puncte? –  > Por big_m.
  • Cred că depinde de tine. Dacă nu publicați o versiune frecventă sau dacă nu trebuie să urmăriți cu strictețe corecțiile de erori prin cicluri de testare frecvente, puteți la fel de bine să folosiți 3 cifre pentru ambele. –  > Por Yunus Nedim Mehel.
  • deci CFBundleVersion poate fi 0 pentru o versiune de magazin de aplicații? O va respinge Apple? –  > Por kraftydevil.
  • Da, puteți utiliza alte valori decât 3 numere cu punctuație. Eu am folosit o valoare de dată-timp, cum ar fi 201606070620 într-o aplicație iOS de expediere. –  > Por Basil Bourque.
  • @BasilBourque, dacă nu respectați liniile directoare, este posibil să întâmpinați o problemă dacă folosiți achiziții în aplicație. Consultați Nota tehnică 2413 –  > Por DanSkeel.
Basil Bourque

Răspunsul dat de rmaddy este corect. Voi adăuga încă două gânduri.

Al treilea număr de versiune

Fiți atenți la cel de-al treilea număr de versiune, specificat pe site-ul web iTunesConnect ca parte a definiției aplicației dvs. Dacă acest număr este diferit de cele două din Xcode, Apple vă dă un avertisment. Puteți ignora avertismentul, deoarece nu este un avertisment care să vă oprească (nu este o „eroare”).

Data-ora ca versiune

De asemenea, nu trebuie să folosiți trei numere cu punctuație. Acest lucru poate avea sens pentru unele aplicații, unde, în mod tradițional, schimbările în primul număr indicau un fel de schimbare dramatică care afectează de obicei compatibilitatea.

Pentru alte aplicații s-ar putea să doriți să folosiți pur și simplu o valoare dată-timp în ISO 8601 în stilul formatului standard ISO 860101 (AAAALLZZDDHHMM). De exemplu, 201606070620. Această ordine de an-lună-data-oră-minut redă un număr tot mai mare, întotdeauna de aceeași lungime datorită umpluturii zero, care, atunci când este sortat în ordine alfabetică, este, de asemenea, cronologic.

Am folosit cu succes acest stil de numere de versiune pe o aplicație iOS de expediere care funcționează în iOS 7, 8, & 9.

Puteți chiar să automatizați generarea acestei valori. În fișierul proiectului dvs. Target > Build Phases > Run Script panou:

  1. Specificați în Shell câmpul: /bin/sh
  2. Lipiți următorul script de 5 linii văzut mai jos.
  3. (opțional) Verificați Show environment variables in build log caseta de selectare.
  4. Debifați caseta de selectare Run script only when installing caseta de selectare.

De fiecare dată când efectuați o compilare, data-timp curent în UTC fusul orar este capturată. Adresa -u din script utilizează mai degrabă UTC decât fusul orar implicit actual. În general, este mai bine ca programatorii și administratorii de sistem să utilizeze și să gândească în UTC decât în fusul orar local.

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

Sau faceți un hibrid, cu un script convențional 1.2.3 pentru numărul versiunii și o dată-timp ca număr de construcție. Pentru a face hibridul, este suficient să comentați CFBundleShortVersionString linie cu un # în față.

plindberg

Schema cea mai sensibilă pentru mine este să folosim numărul de versiune (de ex. CFBundleShortVersionString) pentru numărul real al versiunii, iar apoi să se folosească numărul de construcție (de ex. CFBundleVersion) pentru a reprezenta trimiterea la App Store. Astfel, dacă nu există probleme și, prin urmare, retrimitere, acest număr este întotdeauna 1. Pentru o nouă versiune, îl resetez la 1 dacă cea anterioară a avut probleme în testele TestFlight sau în revizuire.

Numerele de construcție oferă o modalitate de a denumi fiecare dintre trimiterile pe care le furnizați pentru o anumită versiune. Așa cum este descris în definițiile de mai sus, colecția tuturor build-urilor pe care le furnizați pentru o anumită versiune a aplicației dvs. se numește „trenul de lansare” al acelei versiuni. În cazul aplicațiilor iOS, numerele de construcție trebuie să fie unice în cadrul fiecărei versiuni, dar nu este necesar să fie unice în cadrul mai multor versiuni. [sublinierea mea]. Altfel spus, pentru aplicațiile iOS puteți utiliza aceleași numere de construcție în diferite versiuni de lansare, dacă doriți.

De la Nota tehnică TN2420: Numerele de versiune și numerele de construcție.

Comentarii

  • Este bine să vedem un răspuns care oferă o referință oficială care confirmă interpretările prezentate în alte răspunsuri de pe această pagină. –  > Por user2067021.
Qiulang

Eu folosesc CFBundleVersion pentru a indica construcția internă pentru CFBundleShortVersionString. Folosesc zborul de testare pentru a trimite compilări pentru testerii mei, astfel încât diferența dintre ele a fost extrem de utilă.

Documentele Apple spun că CFBundleVersion „ar trebui să fie un șir de caractere format din 3 numere întregi nenegative, separate prin perioade” Dar, de fapt, poate fi MAI MULTE DE 3 părți (așa cum arată răspunsul de mai sus). Eu îl folosesc pentru a indica construcția mea de dezvoltare, să spunem că CFBundleShortVersionString este 1.0.0.0, pot folosi 1.0.0.0.11 pentru CFBundleVersion pentru a indica că este a 11-a construcție pentru versiunea 1.0.0.

Fiecare CFBundleVersion trimisă la magazinul de aplicații trebuie să fie mai mare decât cea anterioară, altfel veți obține EROARE ITMS-90478: „Invalid Version. Construcția cu versiunea „xxx” nu poate fi importată, deoarece o versiune ulterioară a fost închisă pentru depunerea de noi construcții. Alegeți un alt număr de versiune.”

CFBundleShortVersionString poate avea doar 3 părți, altfel veți obține ERROR ITMS-90060:The value for key CFBundleShortVersionString ‘xxx’ in the Info.plist file must be a period-separated list of cel mult trei numere întregi nenegative.”

Site-ul al treilea număr pe care Basil Bourque l-a menționat, și anume numărul de versiune afișat pe iTunesConnect este punctul în care lucrurile se pot complica.

Eu folosesc un număr de iTunesConnect diferit de cel de la CFBundleShortVersionString pentru că atunci când mi-am trimis prima dată aplicația la App Store aveam deja mai multe runde de versiuni interne. Așa că am folosit 1.0 pentru numărul iTunesConnect și 5.x pentru CFBundleShortVersionString. În următoarea versiune pentru magazinul de aplicații am furnizat o funcție pentru a verifica dacă există o versiune mai nouă în magazinul de aplicații și mi-am dat seama că am probleme acum, deoarece pot obține doar numărul iTunesConnect (folosind http://itunes.apple.com/lookup?bundleId=), așa că trebuie să fac un calcul înainte de a-l compara cu numărul CFBundleShortVersionString.

Am încercat să rezolv această problemă folosind numărul iTunesConnect ca număr CFBundleShortVersionString, dar am primit eroarea, EROARE ITMS-90062: „This bundle is invalid. Valoarea pentru cheia CFBundleShortVersionString [x.x.x] din fișierul Info.plist trebuie să conțină o versiune mai mare decât cea a versiunii aprobate anterior [x.x.x].”

Așadar, vă sugerez să le faceți întotdeauna identice.

Dave Evans

Ceva ce nu am văzut niciodată discutat nicăieri este care este numărul maxim pentru fiecare câmp dintr-un CFBundleVersion?

Setând CFBundleVersion într-o aplicație la 1.1.1 și analizând valoarea hexadecimală a versiunii în „lsregister -dump”, am determinat că valoarea maximă pentru primul câmp este (2^22)-1 sau 4194303, iar valorile maxime pentru al doilea și al treilea câmp sunt (2^21)-1 sau 2097151.

Cele 3 câmpuri însumează 64 de biți.

Acest lucru are implicații pentru aceia dintre noi care folosesc CFBundleVersion pe baza datei și a orei.

Am setat primul câmp la YYYYMMDD. Acest lucru este întotdeauna mai mare decât numărul maxim de versiuni permise și ducea la rezultate cel puțin imprevizibile, atunci când Launch Services decidea ce versiune a unei aplicații să ruleze atunci când aveai mai multe versiuni instalate și foloseai ceva de genul „open -a Appname” din linia de comandă.

Vă rugăm să răspândiți acest lucru pe scară largă. Sunt convins că mulți oameni nu reușesc să se descurce cu acest lucru.

Comentarii

  • Vă amintiți ce se face în cazul în care se adaugă un al patrulea câmp (1.1.1.1.20191201) și ce ajungeți să folosiți în schimb? Mi-aș dori ca Apple să folosească aici aceeași valoare numerică pe care a folosit-o Android. P.S. mulțumesc pentru că ați căutat acest lucru! –  > Por spacesuitdiver.
  • Cred că restricția este documentată aici și este mult mai restrictivă decât ceea ce este menționat aici. –  > Por saagarjha.
Kenny Evitt

În momentul de față, documentația Apple pentru CFBundleVersion afirmă [sublinierea mea]:

Versiunea de construcție care identifică o iterație a pachetului.

Această cheie este un șir de caractere care poate fi citit automat, compus din unul până la trei numere întregi separate prin punctede exemplu, 10.14.1. Șirul poate conține numai caractere numerice (0-9) și puncte.

Puteți include mai multe numere întregi, dar sistemul le ignoră.

Pentru CFBundleShortVersionString [sublinierea îmi aparține]:

Numărul versiunii sau al versiunii pachetului.

Această cheie este un șir vizibil pentru utilizator pentru versiunea a pachetului. Formatul necesar este trei numere întregi separate prin punctede exemplu 10.14.1. Șirul poate conține numai caractere numerice (0-9) și puncte.

Aș sugera să se incrementeze automat CFBundleVersion pentru fiecare construcție (sau pentru fiecare versiune în TestFlight) și resetarea la 0 ori de câte ori se modifică CFBundleShortVersionString.

Ar trebui să planificați în mod explicit, sau să concepeți un mijloc consecvent, pentru a actualiza versiunea vizibilă pentru utilizator în CFBundleShortVersionString.

Comentarii

  • Vă mulțumim pentru un răspuns care se referă la cea mai recentă documentație Apple. Aș da rep pentru a da upvote acest lucru de mai multe ori. –  > Por craastad.

Tags: