Bagaimana aplikasi iphone saya dapat mendeteksi nomor versinya sendiri?

254

Saya sedang menulis aplikasi iPhone. Sudah diterbitkan, tetapi saya ingin menambahkan fitur tempat nomor versinya ditampilkan.

Saya lebih suka tidak harus melakukan ini secara manual dengan setiap versi yang saya rilis ...

Apakah ada cara dalam tujuan-C untuk mengetahui versi aplikasi saya?

Brad Larson
sumber
1
Pertanyaan ini sudah dijawab di sini stackoverflow.com/a/16888788/2890157 .
Akshat Singhal
1
.. pertanyaan yang ditautkan adalah 4 tahun kemudian, jadi masalah sebenarnya di sini adalah cmos tidak pernah menerima jawaban. Apapun, jawaban pertanyaan terkait berguna, seperti juga jawabannya di sini. Di kedua utas, lihat melampaui jawaban pertama - terkadang ada lebih banyak info terbaru tentang jawaban nanti.
ToolmakerSteve

Jawaban:

222

Seperti yang saya jelaskan di sini , saya menggunakan skrip untuk menulis ulang file header dengan nomor revisi Subversion saya saat ini. Nomor revisi itu disimpan dalam konstanta kRevisionNumber. Saya kemudian dapat mengakses versi dan nomor revisi menggunakan sesuatu yang mirip dengan yang berikut:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

yang akan membuat string format "Versi 1.0 (51)".

Brad Larson
sumber
152
Itu mengembalikan versi build saya jadi saya menggunakan yang ini. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner
6
CFBundleVersion salah, karena Xcode secara keliru mengisi entri plist dengan nomor build dan bukan nomor versi. jspooner benar.
Oscar
4
Lihat stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 untuk penjelasan yang bagus tentang Angka-angka Versi vs Build. Mengonfirmasi bahwa CFBundleShortVersionStringapa yang biasanya Anda inginkan untuk 'versi' dan CFBundleVersionuntuk Build number.
Rory
3
kRevisionNumber sepertinya tidak bekerja untuk saya. Untuk mendapatkan output yang ditentukan, saya melakukan ini (menggunakan perbaikan @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam
147

Membangun dari jawaban Brad Larson, jika Anda memiliki info versi mayor dan minor yang disimpan dalam daftar info (seperti yang saya lakukan pada proyek tertentu), ini bekerja dengan baik untuk saya:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Sekarang revving versi minor secara manual bisa jadi menyebalkan, dan karenanya menggunakan trik nomor revisi sumber repositori sangat ideal. Jika Anda belum mengikatnya (seperti yang belum saya lakukan), cuplikan di atas dapat bermanfaat. Itu juga mengeluarkan nama tampilan aplikasi.

idStar
sumber
59

Versi cepat untuk keduanya secara terpisah:

Cepat 3

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

Cepat 2

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

Termasuk dalam repo ini, lihat:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
sumber
42

Inilah yang saya lakukan dalam aplikasi saya

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Semoga jawaban sederhana ini akan membantu seseorang ...

Arkady
sumber
1
Untuk kebutuhan saya, ini luar biasa. Terima kasih. +1
David DelMonte
1
Ini mengembalikan nama build, bukan versi
chancyWu
@ chancyWu, CFBundleShortVersionString muncul untuk memberikan versi.
Brian F Leighty
31

Anda dapat menentukan CFBundleShortVersionStringstring di plist.info Anda dan membacanya secara terprogram menggunakan API yang disediakan .

Jasper Bekkers
sumber
30

Ada dua hal - versi build dan versi aplikasi.

  1. Untuk mendapatkan versi Aplikasi:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Untuk mendapatkan versi Build:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Shaik Riyaz
sumber
Apakah ada perbedaan antara keduanya? Mereka berdua mengembalikan yang sama untuk saya.
jjnevis
ya, mungkin nomor build Anda dan versi aplikasi sama dalam pengaturan.
Shaik Riyaz
Oke, saya hanya punya satu pengaturan di RAKEFILE saya - app.version (saya menggunakan RubyMotion). Saya kira keduanya akan memenuhi kebutuhan saya. Terima kasih
jjnevis
Terima kasih kawan Bekerja dengan lancar.
Felipe
1
FYI Ini lebih baik digunakan objectForInfoDictionaryKey:daripada infoDictionary] objectForKey:karena yang pertama mengembalikan nilai yang dilokalkan (jika ada). Mungkin tidak akan membuat perbedaan di sini;)
deanWombourne
17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
John Erck
sumber
1
Apa yang saya butuhkan!
Julius
16

Cara ringkas untuk mendapatkan string versi dalam format XYZ adalah:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Atau, hanya XY:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

Kedua potongan ini mengembalikan string yang akan Anda tetapkan untuk properti teks objek label Anda, misalnya

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
rodamn
sumber
7

Anda dapat mencoba menggunakan kamus sebagai: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Abhishek Verma
sumber
4

Baca file info.plist aplikasi Anda dan dapatkan nilai untuk CFBundleShortVersionString kunci. Membaca info.plist akan memberi Anda objek NSDictionary

hilangInTransit
sumber
4

Anda dapat menggunakan infoDictionary yang mendapatkan detail versi dari info.plist aplikasi Anda. Kode ini berfungsi untuk swift 3. Panggil saja metode ini dan tampilkan versi dalam elemen UI yang diinginkan.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}
rajat chauhan
sumber
3

Swift 5:

Ada dua hal - Versi aplikasi dan versi build

  • Untuk mendapatkan versi Aplikasi:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Untuk mendapatkan versi Build:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Terima kasih @Brad Larson♦banyak

dengST30
sumber
1

Jika Anda memerlukan kombinasi kedua versi dan build num , berikut cara singkat menggunakan Swift 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Tambahkan sebuah as! Stringke akhir baris appVersionatau buildNumuntuk mendapatkan hanya bagian itu sebagai Stringobjek. Tidak perlu untuk itu jika Anda mencari yang lengkapversionInfo .

Saya harap ini membantu!

Astaga
sumber
1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Berdasarkan @rajat, chauhan menjawab tanpa dipaksa untuk String.

apex39
sumber
0

Ini adalah hal yang baik untuk ditangani dengan sistem kontrol revisi. Dengan begitu ketika Anda mendapatkan laporan bug dari pengguna, Anda dapat memeriksa revisi kode itu dan (mudah-mudahan) mereproduksi bug yang menjalankan kode yang sama persis dengan pengguna.

Idenya adalah bahwa setiap kali Anda membangun, Anda akan menjalankan skrip yang mendapatkan nomor revisi kode Anda saat ini dan memperbarui file dalam proyek Anda (biasanya dengan beberapa bentuk penggantian token). Anda kemudian dapat menulis rutin penanganan kesalahan yang selalu menyertakan nomor revisi dalam output kesalahan, atau Anda dapat menampilkannya di halaman "Tentang".

RedFilter
sumber
0

Anda dapat mencoba metode ini:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
BatyrCan
sumber