Bagaimana cara menampilkan versi / membangun jumlah target secara terprogram di aplikasi iOS?

136

Bagaimana saya bisa secara terprogram mendapatkan nilai target version, seperti pada gambar di bawah?

Seperti yang terlihat di jendela Properties dari target proyek Xcode saya. Saya ingin menampilkan ini di layar pembuka aplikasi saya jadi saya tahu versi mana yang sedang digunakan orang-orang?

ramping
sumber

Jawaban:

396

Ada 2 Angka!

Nomor rilis pemasaran untuk pelanggan, disebut nomor versi . 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 . Nomor ini berorientasi pada rilis dan fitur baru. Itu tidak harus berhenti di 9, 1.11.23 adalah nomor versi yang wajar.

Nomor build sebagian besar adalah jumlah internal build yang telah dibuat hingga saat itu. Tetapi beberapa menggunakan nomor lain seperti nomor cabang repositori atau nomor komitnya. Nomor ini seharusnya unik untuk membedakan build yang berbeda, yang hanya memiliki sedikit perubahan tambahan.


Untuk mendapatkan nomor versi :

Objective-C:

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

Swift <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (diuji dengan 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Untuk mendapatkan nomor build :

Objective-C:

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

Swift <3.0:

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Swift 3.0+ (diuji hingga 5.0):

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   

jika kamu mau keduanya dalam satu:

Pertama gunakan baris di atas dan kemudian yang berikutnya.

Objective-C:

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

Swift (diuji hingga 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Catatan:

Nilai-nilai dalam bundel utama tidak selalu ada, misalnya dalam aplikasi baris perintah tidak ada CFBundleShortVersionStringatau CFBundleVersion, sehingga metode akan mengembalikannil dan akan macet karena dalam kode itu membuat downcast yang salah. Namun di aplikasi Cocoa iOS dan Mac normal, nilai-nilai ini ditentukan dan tidak akan dihapus.

Ini diuji dengan Xcode Versi 7.3 (7D175) . Nomor build sering kali ditulis dalam tanda kurung / kurung. 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 di 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"

Untuk Xcode melakukan hal berikut:

Langkah 1

Langkah 1

Langkah 2

Langkah 2

LANGKAH 3

langkah3

Binarian
sumber
4
Hanya untuk menambahkan contoh di atas, "CFBundleVersion" adalah Build = 300, "CFBundleShortVersionString" adalah Version = 0.41. Jawaban Viktor seharusnya jawaban yang benar.
justinkoh
1
Saya pernah mengalami masalah dengan nomor hex. Apple menyatakan untuk menggunakan bilangan bulat: developer.apple.com/library/ios/documentation/general/Reference/…
hashier
Apakah Anda tahu jika ada konstanta string untuk @ "CFBundleShortVersionString" dan @ "CFBundleVersion"?
igrek
Sekarang sistem CI / CD cukup umum, Anda mungkin ingin menunjukkan kesulitan menggunakan skrip build untuk menyetel versi # dengan skrip tersebut.
Sam Ballantyne
1
Hal-hal telah diubah namanya untuk Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")sekarang.
Raphael
13

Anda tidak perlu mengubah apa pun dalam proyek atau Xcode Anda. Berikut versi Swift untuk keduanya secara terpisah:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Ini termasuk dalam repo ini, periksa:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
sumber
jawaban yang mana saya tidak melihatnya
Esqarrouth
Hanya ada satu jawaban, itu ada di paragraf kedua
Daniel Galasko
3
Ya, 1. Ada terlalu banyak suara dan tidak banyak sinyal dalam jawabannya. 2. Ini cepat, yaitu objektif-c. 3. Itu dari era ios5
Esqarrouth
Hal-hal telah diubah namanya untuk Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")sekarang.
Raphael
5

Berikut kode yang sama untuk Swift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
tanaschita
sumber
Bundle.mainmemiliki yang kosong infoDictionaryuntukku; mungkin karena saya melakukannya dari dalam kerangka kerja, bukan yang dapat dieksekusi atau aplikasi? Bundle(for: MyClass.self)berisi nilai yang diharapkan.
Raphael
4

Menampilkan versi dan nomor versi secara terprogram - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"
Sandip Patel - SM
sumber
1

Anda juga bisa menggunakan suka

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Kemudian Anda dapat menggunakan di mana saja saat Anda mendeklarasikan Secara Global.

print(appVersion)

Keluaran:

Version: #1.0 (#1.0.3)
Sivabalaa Jothibose
sumber
1

Saya membuat ekstensi untuk Bundle agar mudah digunakan

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
Amr Marah
sumber