Nilai apa yang harus saya gunakan untuk CFBundleVersion dan CFBundleShortVersionString?

98

Ini adalah pengiriman aplikasi iOS pertama saya dan saya tidak ingin aplikasi saya ditolak.

Ini dari Apple Docs:

CFBundleVersion (String - iOS, OS X) menentukan nomor versi build dari bundel, yang mengidentifikasi iterasi (dirilis atau tidak dirilis) bundel. Nomor versi build harus berupa string yang terdiri dari tiga bilangan bulat non-negatif yang dipisahkan titik dengan bilangan bulat pertama lebih besar dari nol. String hanya boleh berisi karakter numerik (0-9) dan titik (.). Nol di depan dipotong dari setiap bilangan bulat dan akan diabaikan (yaitu, 1.02.3 setara dengan 1.2.3). Kunci ini tidak dapat dilokalkan.

CFBundleShortVersionString (String - iOS, OS X) menentukan nomor versi rilis bundel, yang mengidentifikasi iterasi yang dirilis dari aplikasi. Nomor versi rilis adalah string yang terdiri dari tiga bilangan bulat yang dipisahkan oleh periode. Bilangan bulat pertama mewakili revisi besar pada aplikasi, seperti revisi yang menerapkan fitur baru atau perubahan besar. Bilangan bulat kedua menunjukkan revisi yang menerapkan fitur yang kurang menonjol. Bilangan bulat ketiga mewakili rilis pemeliharaan.

Nilai untuk kunci ini berbeda dari nilai untuk "CFBundleVersion", yang mengidentifikasi iterasi (dirilis atau tidak dirilis) aplikasi. Kunci ini dapat dilokalkan dengan memasukkannya ke dalam file InfoPlist.strings Anda.

Tapi sepertinya agak aneh. Interpretasi saya untuk ini adalah menempatkan kedua nilai yang sama, yaitu:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Bisakah seseorang mengkonfirmasi 100% bahwa itu yang seharusnya saya masukkan?

Bbx
sumber
1
Oleh karena itu, CFBundleShortVersionString dapat dilokalkan. Tetapi jika harus berupa tiga bilangan bulat yang dipisahkan oleh titik, pelokalan apa yang mungkin?
Rick
@ Rick Saya kira itu berarti Anda dapat mengonversinya untuk bahasa yang sebenarnya memiliki angka yang berbeda, seperti bahasa Arab?
shiser
@shiser Hanya untuk menjadi bertele-tele, "angka arab" sebenarnya adalah angka yang kami gunakan di dunia barat, dan sebagian besar tempat lainnya juga. Tapi saya mengerti maksud Anda, dan ada beberapa bagian dunia arab yang tidak menggunakan "angka arab". en.wikipedia.org/wiki/Arabic_numerals
RenniePet
1
Jawaban lain disini. stackoverflow.com/q/21125159/419348
AechoLiu

Jawaban:

77

Anggap saja seperti ini: "versi singkat" ( CFBundleShortVersionString) adalah nomor versi publik. "Versi" ( CFBundleVersion) lebih merupakan nomor versi internal yang dapat berubah jauh lebih sering daripada "versi pendek" publik. Secara pribadi saya menggunakan yang sama untuk keduanya tetapi banyak orang memperbarui "versi" pada setiap build. Apa pun itu, Anda biasanya memperbarui "versi pendek" saat merilis ke Apple. Seberapa sering Anda memperbarui "versi" terserah Anda dan kebutuhan Anda.

rmaddy
sumber
14
Ketahuilah bahwa versi bundel (CFBundleVersion) harus melebihi versi bundel dari aplikasi Anda sebelumnya atau akan mendapatkan kesalahan saat mengirimkan ke App Store. Lihat stackoverflow.com/questions/4933093/… .
Phil
3
Mirip dengan apa yang dikatakan Phil di atas, saat ini, jika Anda mengirim ulang build yang gagal (tidak disetujui oleh App Store), sepertinya Anda perlu mengganti CFBundleVersion pada setiap pengiriman sekarang , jadi kemungkinan angka-angka ini akan berbeda kecuali Anda selalu sempurna, atau Anda tidak keberatan menabrak versi publik Anda (CFBundleShortVersionString) # pada setiap perubahan yang diperlukan untuk pengiriman yang berhasil ke App Store.
likethesky
106

CFBundleShortVersionString memberi Anda versi aplikasi Anda. Ini biasanya bertambah setiap kali Anda memublikasikan aplikasi Anda ke App Store. Ini adalah versi yang terlihat di bagian "Versi" untuk halaman App Store aplikasi Anda.

CFBundleVersion memberi Anda nomor build yang digunakan untuk pengembangan dan pengujian, yaitu tujuan "teknis". Pengguna akhir jarang tertarik dengan nomor build, tetapi selama pengembangan, Anda mungkin perlu mengetahui apa yang sedang dikembangkan dan diperbaiki pada setiap build. Ini biasanya bertambah pada setiap iterasi rilis internal. Dan Anda dapat menggunakan alat integrasi berkelanjutan seperti Jenkins untuk menaikkan nomor versi secara otomatis pada setiap versi.

Versi dan nomor Build

Kedua angka tersebut tidak bergantung satu sama lain, tetapi sebaiknya jaga agar tetap sejajar untuk menghindari kebingungan. Perlu diingat bahwa setelah aplikasi Anda lulus peninjauan App Store, Anda perlu menaikkan nomor build seperti yang dinyatakan Phil dan likeTheSky, terlepas dari apakah Anda memublikasikannya atau tidak.

Kasus penggunaan: Misalnya, Anda memiliki build yang sudah teruji dengan baik, siap untuk dikirimkan. Nomor versinya adalah 1.0.0 dan nomor build adalah 1.0.0.32 . Setelah Anda mengirimkan aplikasi, Anda perlu memperbarui versinya sebagai 1.0.1 dan nomor build sebagai 1.0.1.0 .

Yunus Nedim Mehel
sumber
4
Jadi, apakah aman untuk mengabaikan bit tersebut di dokumen (dikutip dalam pertanyaan) tentang CFBundleVersion sebagai nilai " tiga " yang dipisahkan oleh periode?
big_m
Saya pikir itu terserah Anda. Jika Anda tidak sering memublikasikan rilis atau jika Anda tidak perlu mengikuti perbaikan bug secara ketat melalui siklus pengujian yang sering; Anda mungkin juga menggunakan 3 digit untuk keduanya.
Yunus Nedim Mehel
jadi dapatkah CFBundleVersion menjadi 0 untuk membangun toko aplikasi? Akankah Apple menolaknya?
kraftydevil
3
Ya, Anda dapat menggunakan nilai selain 3 angka dengan tanda baca. Saya telah menggunakan nilai tanggal-waktu seperti 201606070620dalam aplikasi pengiriman iOS.
Basil Bourque
3
@BasilBourque, jika Anda tidak mengikuti pedoman, Anda mungkin mengalami masalah jika Anda menggunakan pembelian dalam aplikasi. Lihat Catatan Teknis 2413
DanSkeel
16

The jawaban dengan rmaddy benar. Saya akan menambahkan dua pemikiran lagi.

Nomor Versi Ketiga

Perhatikan nomor versi ketiga, yang ditentukan di situs web iTunesConnect sebagai bagian dari definisi aplikasi Anda. Jika nomor itu berbeda dari dua di Xcode, Apple memberi Anda peringatan. Anda dapat mengabaikan peringatan tersebut, karena ini bukan show-stopper (bukan "error").

Tanggal-Waktu sebagai versi

Selain itu, Anda tidak perlu menggunakan tiga angka dengan tanda baca. Itu mungkin masuk akal untuk beberapa aplikasi, di mana secara tradisional perubahan pada angka pertama menunjukkan semacam perubahan dramatis yang biasanya memengaruhi kompatibilitas.

Untuk aplikasi lain, Anda mungkin ingin menggunakan nilai tanggal-waktu dalam gaya format standar ISO 8601 (YYYYMMDDHHMM). Misalnya 201606070620,. Urutan tahun-bulan-tanggal-jam-menit membuat angka yang terus meningkat, selalu memiliki panjang yang sama karena mengisi nol, yang bila diurutkan menurut abjad juga kronologis.

Saya telah berhasil menggunakan gaya nomor versi ini pada aplikasi pengiriman iOS yang berfungsi di iOS 7, 8, & 9.

Anda bahkan dapat mengotomatiskan pembuatan nilai ini. Dalam proyek Anda Target> Build Phases> Run Scriptpanel:

  1. Tentukan di Shelllapangan:/bin/sh
  2. Tempel skrip 5 baris berikut yang terlihat di bawah ini.
  3. (opsional) Centang Show environment variables in build logkotak.
  4. Hapus centang pada Run script only when installingkotak centang.

Setiap kali Anda membangun tanggal-waktu saat ini di zona waktu UTC diambil. The -ubendera di script yang menggunakan UTC bukan zona waktu default Anda saat ini. Umumnya paling baik untuk programmer dan sysadmin untuk menggunakan dan berpikir dalam UTC daripada zona waktu lokal.

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

Atau lakukan hybrid, dengan konvensional 1.2.3untuk nomor Versi dan tanggal-waktu sebagai nomor Build. Untuk melakukan hibrid, cukup beri komentar pada CFBundleShortVersionStringbaris dengan #di depan.

Basil Bourque
sumber
8

Skema yang paling masuk akal bagi saya adalah menggunakan nomor versi (mis. CFBundleShortVersionString) Untuk nomor versi sebenarnya, lalu menggunakan nomor versi (yaitu CFBundleVersion) untuk mewakili pengiriman ke App Store. Jadi, kecuali jika ada masalah dan karenanya dikirimkan kembali, nomor ini selalu 1. Untuk rilis baru, saya setel ulang ke 1 jika sebelumnya ada masalah dalam pengujian TestFlight atau sedang ditinjau.

Nomor versi menyediakan cara untuk memberi nama setiap kiriman yang Anda berikan untuk rilis tertentu. Seperti yang dijelaskan dalam definisi di atas, kumpulan semua build yang Anda sediakan untuk versi tertentu aplikasi Anda disebut 'rangkaian rilis' versi itu. Untuk aplikasi iOS, nomor build harus unik dalam setiap rangkaian rilis, tetapi tidak perlu unik di seluruh rangkaian rilis [penekanan saya]. Artinya, untuk Aplikasi iOS Anda dapat menggunakan nomor build yang sama lagi di rangkaian rilis yang berbeda jika Anda mau.

Dari Catatan Teknis TN2420: Nomor Versi dan Nomor Build .

plindberg
sumber
1
Senang melihat jawaban yang memberikan referensi resmi yang mengkonfirmasikan interpretasi yang disajikan dalam jawaban lain di halaman ini.
pengguna2067021
6

Saya menggunakan CFBundleVersion untuk menunjukkan internal build untuk CFBundleShortVersionString . Saya menggunakan uji terbang untuk mengirimkan build untuk penguji saya, sehingga perbedaan di antara build sangat berguna.

Dokumen Apple mengatakan CFBundleVersion "harus berupa string yang terdiri dari 3 bilangan bulat non-negatif, dipisahkan titik" Tapi sebenarnya itu bisa LEBIH DARI 3 bagian (seperti yang ditunjukkan jawaban di atas). Saya menggunakannya untuk menunjukkan build pengembangan saya, katakanlah CFBundleShortVersionString saya adalah 1.0.0, saya dapat menggunakan 1.0.0.11 untuk CFBundleVersion untuk menunjukkan bahwa build ke-11 saya untuk rilis 1.0.0

Setiap CFBundleVersion yang dikirimkan ke App Store harus lebih besar dari sebelumnya atau Anda akan mendapatkan ERROR ITMS-90478 : "Versi Tidak Valid. Build dengan versi" xxx "tidak dapat diimpor karena versi yang lebih baru telah ditutup untuk pengiriman build baru. Pilih nomor versi yang berbeda. "

CFBundleShortVersionString hanya dapat memiliki 3 bagian atau Anda akan mendapatkan ERROR ITMS-90060: Nilai untuk kunci CFBundleShortVersionString 'xxx' dalam file Info.plist harus berupa daftar yang dipisahkan oleh periode dari paling banyak tiga bilangan bulat non-negatif. "

Angka ke - 3 yang disebutkan Basil Bourque, yaitu nomor versi yang ditampilkan di iTunesConnect adalah tempat yang mungkin menjadi rumit.

Saya menggunakan nomor iTunesConnect yang berbeda dari CFBundleShortVersionString karena ketika saya pertama kali mengirimkan aplikasi saya ke app store, kami sudah memiliki banyak putaran rilis internal. Jadi saya menggunakan 1.0 untuk nomor iTunesConnect dan 5.x untuk CFBundleShortVersionString. Pada rilis berikutnya ke toko aplikasi saya menyediakan fungsi untuk memeriksa apakah ada versi yang lebih baru di toko aplikasi dan menyadari bahwa saya mengalami masalah sekarang karena saya hanya bisa mendapatkan nomor iTunesConnect (menggunakan http://itunes.apple.com/lookup?bundleId=) jadi saya perlu melakukan beberapa perhitungan sebelum membandingkannya dengan nomor CFBundleShortVersionString.

Saya mencoba memperbaikinya dengan menggunakan nomor iTunesConnect sebagai CFBundleShortVersionString saya, tetapi mendapatkan kesalahan, ERROR ITMS-90062 : "Bundel ini tidak valid. Nilai untuk kunci CFBundleShortVersionString [xxx] di file Info.plist harus berisi versi yang lebih tinggi dari itu dari versi yang sebelumnya disetujui [xxx]. "

Jadi saya akan menyarankan untuk selalu membuatnya sama.

Qiulang
sumber
5

Sesuatu yang belum pernah saya lihat dibahas di mana pun adalah berapa jumlah maksimum untuk setiap bidang dalam CFBundleVersion?

Dengan menyetel CFBundleVersion di aplikasi ke 1.1.1 dan melihat nilai heksadesimal untuk versi di "lsregister -dump", saya menentukan bahwa nilai maksimum untuk bidang pertama adalah (2 ^ 22) -1 atau 4194303, dan maksimum nilai untuk bidang kedua dan ketiga adalah (2 ^ 21) -1 atau 2097151.

3 bidang menambahkan hingga 64 bit.

Ini berimplikasi pada kita yang menggunakan CFBundleVersion berdasarkan tanggal dan waktu.

Saya mengatur bidang pertama ke YYYYMMDD. Ini selalu lebih besar dari versi maksimum yang diizinkan dan itu mengarah ke hasil yang tidak dapat diprediksi, paling tidak, ketika Launch Services memutuskan versi aplikasi mana yang akan dijalankan ketika Anda menginstal beberapa versi dan menggunakan sesuatu seperti 'open -a Appname 'dari baris perintah.

Tolong sebarkan ini secara luas. Saya yakin banyak orang yang lepas kendali dengan ini.

Dave Evans
sumber
Apakah Anda ingat apa yang dilakukan jika kolom keempat ditambahkan (1.1.1.20191201) dan apa yang akhirnya Anda gunakan? Saya benar-benar berharap Apple hanya menggunakan nilai numerik yang sama dengan yang dilakukan android di sini. PS terima kasih telah mencari ini!
baju antariksa
Saya yakin pembatasan tersebut didokumentasikan di sini dan sedikit lebih ketat daripada yang disebutkan di sini.
saagarjha
3

Sampai sekarang, dokumentasi Apple untukCFBundleVersion negara bagian [penekanan saya]:

Versi build yang mengidentifikasi iterasi bundel.

...

Kunci ini adalah string yang dapat dibaca mesin yang terdiri dari satu hingga tiga bilangan bulat yang dipisahkan periode , seperti 10.14.1. String hanya boleh berisi karakter numerik (0-9) dan titik.

...

Anda dapat memasukkan lebih banyak bilangan bulat tetapi sistem mengabaikannya.

Untuk CFBundleShortVersionString[penekanan saya]:

Rilis atau nomor versi paket.

...

Kunci ini adalah string yang dapat dilihat pengguna untuk versi bundel. Format yang diperlukan adalah tiga bilangan bulat yang dipisahkan titik , seperti 10.14.1. String hanya boleh berisi karakter numerik (0-9) dan titik.

Saya sarankan hanya menambahkan secara otomatis CFBundleVersionuntuk setiap build (atau setiap rilis ke TestFlight) dan menyetel ulang ke 0 setiap kali Anda mengubahnya CFBundleShortVersionString.

Anda harus secara eksplisit merencanakan, atau merancang cara yang konsisten, untuk memperbarui versi pengguna yang terlihat di CFBundleShortVersionString.

Kenny Evitt
sumber