Versi vs build di Xcode

660

Saya memiliki aplikasi yang saya kembangkan dengan Xcode 3 dan baru-baru ini mulai mengedit dengan Xcode 4. Dalam ringkasan target saya memiliki formulir target aplikasi iOS dengan bidang: pengidentifikasi, versi, build, perangkat, dan target penyebaran. Kolom versi kosong dan bidang build adalah 3.4.0 (yang cocok dengan versi aplikasi sejak saya masih mengedit dengan Xcode 3).

Pertanyaan saya adalah:

  1. Apa perbedaan antara versi dan bidang yang dibangun?

  2. Mengapa bidang versi kosong setelah saya memutakhirkan ke Xcode 4?

chris
sumber
Untuk satu hal, saya pikir itu adalah nomor Bangun yang muncul di daftar arsip Xcode Organizer. Selain itu, saya tidak yakin digunakan untuk apa.
Daniel Dickison

Jawaban:

1224

Apple semacam mengatur ulang / repurposed bidang.

Selanjutnya, jika Anda melihat pada tab Info untuk Target Aplikasi Anda, Anda harus menggunakan "String versi bundel, pendek" sebagai Versi Anda (mis., 3.4.0) dan "Versi bundel" sebagai Build Anda (mis. 500 atau 1A500 ). Jika Anda tidak melihat keduanya, Anda dapat menambahkannya. Mereka akan memetakan ke Versi dan Bangun kotak teks yang tepat pada tab Ringkasan; mereka adalah nilai yang sama.

Saat melihat tab Info, jika Anda mengklik kanan dan memilih Show Raw Keys / Values , Anda akan melihat nama sebenarnya CFBundleShortVersionString(Versi) dan CFBundleVersion(Build).

Versi ini biasanya menggunakan bagaimana Anda tampaknya telah menggunakannya dengan Xcode 3. Saya tidak yakin pada level apa Anda bertanya tentang perbedaan Versi / Build, jadi saya akan menjawabnya secara filosofis.

Ada berbagai macam skema, tetapi yang populer adalah:

{MajorVersion}. {MinorVersion}. {Revisi}

  • Versi utama - Perubahan besar, desain ulang, dan perubahan fungsi
  • Versi minor - Peningkatan minor, penambahan fungsi
  • Revisi - Nomor tambalan untuk perbaikan bug

Kemudian Build digunakan secara terpisah untuk menunjukkan jumlah total build untuk rilis atau untuk seluruh masa pakai produk.

Banyak pengembang memulai Build number pada 0, dan setiap kali mereka membangun mereka menambah jumlahnya dengan satu, meningkat selamanya. Dalam proyek saya, saya memiliki skrip yang secara otomatis meningkatkan jumlah build setiap kali saya membangun. Lihat instruksi untuk itu di bawah ini.

  • Rilis 1.0.0 mungkin build 542. Butuh 542 build untuk mencapai rilis 1.0.0.
  • Rilis 1.0.1 mungkin versi 578.
  • Rilis 1.1.0 mungkin dibuat 694.
  • Rilis 2.0.0 mungkin membangun 949.

Pengembang lain, termasuk Apple, memiliki nomor Build yang terdiri dari versi utama + versi minor + jumlah build untuk rilis. Ini adalah nomor versi perangkat lunak yang sebenarnya, yang bertentangan dengan nilai yang digunakan untuk pemasaran.

Jika Anda masuk ke menu Xcode > Tentang Xcode , Anda akan melihat Versi dan nomor Bangun. Jika Anda menekan tombol More Info ... Anda akan melihat banyak versi yang berbeda. Karena Info lebih lanjut ... tombol telah dihapus di Xcode 5, informasi ini juga tersedia dari Software> Developer bagian dari Sistem Informasi aplikasi, tersedia dengan membuka Apel menu> Tentang Mac ini > Sistem Laporan ... .

Misalnya, Xcode 4.2 (4C139). Versi pemasaran 4.2 adalah Build versi mayor 4, Build minor versi C, dan Build number 139. Rilis berikutnya (mungkin 4.3) kemungkinan akan menjadi Build release 4D, dan Build number akan dimulai dari 0 dan selisih dari sana.

Nomor Versi iPhone Simulator / Build adalah cara yang sama, seperti iPhone, Mac, dll.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

Pembaruan : Dengan permintaan, berikut adalah langkah-langkah untuk membuat skrip yang berjalan setiap kali Anda membangun aplikasi di Xcode untuk membaca nomor Build, menambahkannya, dan menulisnya kembali ke file aplikasi {App}-Info.plist. Ada langkah-langkah tambahan opsional jika Anda ingin menulis versi / nomor build Anda ke Settings.bundle/Root*.plistfile Anda .

Ini diperpanjang dari artikel how-to di sini .

Dalam Xcode 4.2 - 5.0:

  1. Muat proyek Xcode Anda.
  2. Di panel sebelah kiri, klik proyek Anda di bagian paling atas hierarki. Ini akan memuat editor pengaturan proyek.
  3. Di sisi kiri panel jendela tengah, klik aplikasi Anda di bawah judul TARGET . Anda perlu mengkonfigurasi pengaturan ini untuk setiap target proyek.
  4. Pilih tab Bangun Fase .
    • Di Xcode 4, di kanan bawah, klik tombol Add Build Phase dan pilih Add Run Script .
    • Dalam Xcode 5, pilih menu Editor > Tambah Fase Pembuatan > Tambahkan Fase Pembuatan Skrip Run .
  5. Seret dan taruh fase Run Script yang baru untuk memindahkannya tepat sebelum fase Copy Bundle Resources (ketika file app-info.plist akan digabungkan dengan aplikasi Anda).
  6. Dalam baru Run Script fase, mengatur Shell : /bin/bash.
  7. Salin dan tempel berikut ini ke area skrip untuk angka bilangan bulat integer:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

    Seperti yang ditunjukkan oleh @Bdebeez, Apple Generic Versioning Tool ( agvtool) juga tersedia. Jika Anda lebih suka menggunakannya, maka ada beberapa hal yang harus diubah terlebih dahulu:

    • Pilih tab Bangun Pengaturan .
    • Di bawah bagian Versi , setel Versi Proyek Saat Ini ke nomor build awal yang ingin Anda gunakan, misalnya, 1 .
    • Kembali pada tab Build Phases , seret-dan-jatuhkan fase Run Script Anda setelah fase Copy Bundle Resources untuk menghindari kondisi balapan saat mencoba membangun dan memperbarui file sumber yang menyertakan nomor build Anda.

    Perhatikan bahwa dengan agvtoolmetode ini Anda mungkin masih mendapatkan bangunan gagal / dibatalkan secara berkala tanpa kesalahan. Untuk alasan ini, saya tidak merekomendasikan penggunaan agvtooldengan skrip ini.

    Namun demikian, dalam fase Run Script Anda, Anda dapat menggunakan skrip berikut:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all

    The next-versionargumen increment nomor membangun ( bumpjuga alias untuk hal yang sama), dan -allupdate Info.plistdengan nomor membangun baru.

  8. Dan jika Anda memiliki bundel Pengaturan tempat Anda menampilkan Versi dan Bangun, Anda dapat menambahkan berikut ini di akhir skrip untuk memperbarui versi dan membangun. Catatan: Ubah PreferenceSpecifiersnilainya agar sesuai dengan pengaturan Anda. PreferenceSpecifiers:2berarti melihat item pada indeks 2 di bawah PreferenceSpecifiersarray dalam file plist Anda, jadi untuk indeks berbasis 0, itulah pengaturan preferensi ke-3 dalam array.

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist

    Jika Anda menggunakan agvtoolalih-alih membaca Info.plistsecara langsung, Anda dapat menambahkan yang berikut ke skrip Anda sebagai gantinya:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
  9. Dan jika Anda memiliki aplikasi universal untuk iPad & iPhone, maka Anda juga dapat mengatur pengaturan untuk file iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist
nekno
sumber
17
"Dalam proyek saya, saya memiliki skrip yang secara otomatis meningkatkan jumlah build setiap kali saya membangun" - dapatkah Anda membagikan bagaimana Anda melakukannya? terima kasih untuk perinciannya dan untuk pertanyaan aslinya.
Zsolt
2
@Andrews - Saya memperbarui jawaban saya dengan detail pada skrip build.
nekno
9
Untuk menambah Dalam angka Hex yang dapat Anda gunakanbuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"
Alon Amir
8
Singkatnya: HEX tidak diizinkan di AppStore.
Nicolas Miari
3
(Pengguna Xcode 5) Anda mungkin perlu mengubah langkah 5 untuk membaca: "Dari Bilah Menu, pilih Editor -> Tambahkan Fase Pembuatan -> Tambahkan Fase Pembuatan Skrip Run"
Greg M. Krsak
72

(Hanya meninggalkan ini di sini untuk referensi saya sendiri.) Ini akan menampilkan versi dan membangun untuk bidang "versi" dan "membangun" yang Anda lihat dalam target Xcode:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

Dalam Swift

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}
Dan Rosenstark
sumber
2
OT: Anda memiliki kebocoran dalam metode Anda - Anda alloc/ initstring, yang mempertahankan string, tetapi Anda tidak melepaskannya. Pada objek yang Anda kembali dari suatu metode, Anda umumnya harus menggunakan metode kenyamanan sehingga string tersebut autoreleased secara otomatis, atau panggilan autorelease. Baik: return [NSString stringWithFormat:@"%@ build %@", version, build]; ATAU return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
nekno
1
Terima kasih @nekno, jawaban berubah jadi ARC atau non-ARC friendly.
Dan Rosenstark
2
Mungkin lebih baik menggunakan konstanta jika tersedia (mis. KCFBundleVersionKey), untuk menghindari kesalahan ketik. Meskipun demikian, saya tidak dapat menemukan satu untuk "CFBundleShortVersionString" :)
DannyA
Anda memiliki bug dalam kode cepat - Anda menelepon CFBundleShortVersionString dua kali
Yariv Nissim
Terima kasih @ yar1vn, saya memperbaikinya dan TIDAK itu tidak mundur.
Dan Rosenstark
53

Nomor Bangun adalah nomor internal yang menunjukkan keadaan aplikasi saat ini. Ini berbeda dari nomor versi karena biasanya tidak menghadap ke pengguna dan tidak menunjukkan perbedaan / fitur / peningkatan seperti yang biasanya dilakukan oleh nomor versi.

Pikirkan seperti ini:

  • Build ( CFBundleVersion): Jumlah build. Biasanya Anda memulai ini pada 1 dan meningkat sebesar 1 dengan masing-masing membangun aplikasi. Dengan cepat memungkinkan untuk perbandingan yang membangun lebih baru dan itu menunjukkan rasa kemajuan basis kode. Ini bisa sangat berharga ketika bekerja dengan QA dan perlu memastikan bug dicatat terhadap build yang tepat.
  • Versi Pemasaran ( CFBundleShortVersionString): Nomor yang menghadap pengguna yang Anda gunakan untuk menunjukkan versi aplikasi Anda ini. Biasanya ini mengikuti skema versi Major.minor (mis. MyAwesomeApp 1.2) untuk memberi tahu pengguna rilis mana yang merupakan pembaruan pemeliharaan yang lebih kecil dan yang merupakan fitur baru yang sangat penting.

Untuk menggunakan ini secara efektif dalam proyek Anda, Apple menyediakan alat hebat yang disebut agvtool. Saya sangat merekomendasikan menggunakan ini karena JAUH lebih sederhana daripada scripting perubahan plist. Ini memungkinkan Anda untuk dengan mudah mengatur nomor build dan versi pemasaran. Ini sangat berguna ketika membuat skrip (misalnya, dengan mudah memperbarui nomor build pada setiap build atau bahkan menanyakan apa nomor build saat ini). Ia bahkan dapat melakukan hal-hal yang lebih eksotis seperti menandai SVN Anda untuk Anda ketika Anda memperbarui nomor build.

Untuk menggunakannya:

  • Atur proyek Anda dalam Xcode, di bawah Versioning, untuk menggunakan "Apple Generic".
  • Di terminal
    • agvtool new-version 1 (setel nomor Bangun ke 1)
    • agvtool new-marketing-version 1.0 (atur versi Pemasaran ke 1.0)

Lihat halaman manual agvtooluntuk satu ton info yang bagus

Bdebeez
sumber
artikel lain tentang agvtool Versi Aplikasi iPhone Mudah dengan agvtool
Gon
25

Skrip untuk menambah angka build dalam jawaban di atas tidak berfungsi untuk saya jika nomor build adalah nilai floating point, jadi saya memodifikasinya sedikit:

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
ale84
sumber
21

Nomor rilis pemasaran adalah untuk pelanggan, yang disebut nomor versi . Ini dimulai dengan 1.0 dan naik untuk pembaruan besar ke 2.0 , 3.0 , untuk pembaruan kecil ke 1.1 , 1.2 dan untuk perbaikan bug ke 1.0.1 , 1.0.2 . Jumlah ini berorientasi pada rilis dan fitur baru.

Jumlah build sebagian besar adalah jumlah internal build yang telah dibuat sampai saat itu. Tetapi beberapa menggunakan nomor lain seperti nomor cabang repositori. Angka ini harus unik untuk membedakan bangunan yang hampir sama.

Seperti yang Anda lihat, nomor build tidak perlu dan terserah Anda nomor build mana yang ingin Anda gunakan. Jadi, jika Anda memperbarui Xcodeke versi utama, bidang build kosong. Kolom versi mungkin tidak kosong !.


Untuk mendapatkan nomor build sebagai NSStringvariabel:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Untuk mendapatkan nomor versi sebagai NSStringvariabel:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Jika Anda ingin keduanya dalam satu NSString:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Ini diuji dengan Xcode Versi 4.6.3 (4H1503) . Nomor build sering ditulis dalam kurung / kurung kurawal. Nomor build dalam heksadesimal atau desimal.

buildandversion


Di Xcode Anda dapat secara otomatis menambah nomor build sebagai angka desimal dengan menempatkan yang berikut ini dalam Run scriptfase build dalam pengaturan proyek

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Untuk nomor build heksadesimal gunakan skrip ini

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

project_settings

Binarian
sumber
6

Terima kasih kepada @nekno dan @ ale84 untuk jawaban yang bagus.

Namun, saya memodifikasi skrip @ ale84 sedikit demi meningkatkan angka bangun untuk floating point.

nilai incl dapat diubah sesuai dengan persyaratan format mengambang Anda. Untuk misalnya: jika termasuk = .01, format output akan menjadi ... 1.19, 1.20, 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
iHS
sumber
1

Cara lain adalah dengan mengatur nomor versi di appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}
tandai VanderWiele
sumber