İPhone uygulamam kendi sürüm numarasını nasıl tespit edebilir?


254

Bir iPhone uygulaması yazıyorum. Zaten yayınlanmış, ancak sürüm numarasının görüntülendiği bir özellik eklemek istiyorum.

Bunu, yayınladığım her sürümle manuel olarak yapmak istemem ...

Hedef-C uygulamamın sürümünün ne olduğunu öğrenmenin bir yolu var mı?


1
Bu soru daha önce burada cevaplanmıştır stackoverflow.com/a/16888788/2890157 .
Akshat Singhal

1
.. bağlantılı soru 4 yıl sonra, bu yüzden burada asıl mesele CMOS asla bir cevap kabul etmedi . Ne olursa olsun, buradaki yanıtlar gibi bağlantılı sorunun cevapları da faydalıdır. Her iki iş parçacığında da ilk cevabın ötesine bakın - bazen daha sonraki bir cevapta daha güncel bilgiler bulunur.
ToolmakerSteve

Yanıtlar:


222

Burada açıkladığım gibi , bir başlık dosyasını geçerli Subversion revizyon numaram ile yeniden yazmak için bir komut dosyası kullanıyorum. Bu revizyon numarası kRevisionNumber sabitinde saklanır. Daha sonra aşağıdakine benzer bir şey kullanarak sürüm ve revizyon numarasına erişebilirim:

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

"Sürüm 1.0 (51)" biçiminde bir dize oluşturur.


152
Bu, yapı sürümümü döndürdü, bu yüzden bunu kullandım. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner

6
CFBundleVersion yanlıştır, çünkü Xcode yanlışlıkla plist girişini sürüm numarasıyla değil, yapı numarasıyla doldurur. jspooner doğrudur.
Oscar

4
Sürüm ile Yapı numaralarının harika bir açıklaması için stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 adresine bakın . CFBundleShortVersionStringNormalde 'sürüm' ve CFBundleVersionYapı numarası için ne istediğinizi onaylar .
Rory

3
kRevisionNumber benim için çalışmıyor gibi görünüyor. Belirtilen çıktıyı elde etmek için bunu yaptım (@jspooner'ın düzeltmesini kullanarak):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam

147

Brad Larson'un cevabına dayanarak, bilgi plistinde depolanan büyük ve küçük sürüm bilginiz varsa (belirli bir projede yaptığım gibi), bu benim için iyi çalıştı:

- (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];
}

Şimdi küçük bir sürümü manuel olarak revize etmek bir acı olabilir ve bu nedenle kaynak havuz revizyon numarası hilesi kullanmak idealdir. Eğer (benim gibi) bağlamadıysanız, yukarıdaki pasaj faydalı olabilir. Ayrıca uygulamanın görünen adını da çıkarır.


59

Her ikisi için ayrı ayrı hızlı sürüm:

Hızlı 3

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

Hızlı 2

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

Bu repoya dahil, bir göz atın:

https://github.com/goktugyil/EZSwiftExtensions


42

Başvurumda yaptığım şey bu

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

Umarım bu basit cevap birine yardımcı olur ...


1
Benim ihtiyaçlarım için, bu harika. Teşekkürler. +1
David DelMonte

1
Bu sürüm değil derleme adını döndürür
chancyWu 7:14

@chancyWu, CFBundleShortVersionString sürümü veriyor gibi görünüyor.
Brian F Leighty


30

İki şey var - derleme sürümü ve uygulama sürümü.

  1. Uygulama sürümünü edinmek için:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Derleme sürümünü edinmek için:

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

Bu ikisi arasında herhangi bir fark var mı? İkisi de benim için aynı şekilde geri dönüyor.
jjnevis

evet, yapı numaranız ve uygulama sürümünüz ayarlarda aynı olabilir.
Shaik Riyaz

Tamam, RAKEFILE uygulamamda sadece bir ayar var - app.version (RubyMotion kullanıyorum). Sanırım her ikisi de ihtiyaçlarımı karşılayacak. Thanks
jjnevis

Teşekkürler dostum. Sorunsuz çalıştı.
Felipe

1
FYI İlkinin yerelleştirilmiş değeri döndürmesi (yerine varsa) objectForInfoDictionaryKey:yerine kullanılması tercih edilir infoDictionary] objectForKey:. Muhtemelen burada bir fark yaratmayacak;)
deanWombourne

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
Tam olarak ihtiyacım olan şey!
Julius

16

XYZ biçiminde bir sürüm dizesi elde etmenin kısa bir yolu :

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

Veya sadece XY için:

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

Bu snippet'lerin her ikisi de, etiket nesnenizin text özelliğine atayacağınız dizeleri döndürür;

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

7

Sözlüğü şu şekilde kullanmayı deneyebilirsiniz: -

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

Uygulamanızın info.plist dosyasını okuyun ve CFBundleShortVersionString anahtarının değerini alın. İnfo.plist'i okumak size bir NSDictionary nesnesi verecektir


4

Uygulamanızın info.plist'inden sürüm bilgilerini alan infoDictionary kullanabilirsiniz. Bu kod hızlı 3 için çalışır. Sadece bu yöntemi çağırın ve sürümü herhangi bir tercih edilen kullanıcı arayüzü öğesinde görüntüleyin.

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)"
}

3

Hızlı 5:

İki şey var - Uygulama sürümü ve derleme sürümü

  • Uygulama sürümünü edinmek için:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Derleme sürümünü edinmek için:

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

Teşekkürler @Brad Larson♦çok


1

Eğer bir ihtiyaç varsa kombinasyonu hem sürümüne ve yapı num , burada kullanarak kısa yoldur 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)"

Nesne olarak yalnızca o kısmı almak as! Stringiçin appVersionveya buildNumsatırının sonuna bir ekleyin String. Tam arıyorsanız, buna gerek yok versionInfo.

Umarım bu yardımcı olur!


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

@Rajat chauhan cevabına dayanmadan zorla oyuncu seçimi String.


0

Bu bir revizyon kontrol sistemi ile başa çıkmak için iyi bir şeydir. Bu şekilde bir kullanıcıdan hata raporu aldığınızda, kod revizyonunu kontrol edebilir ve (umarım) kullanıcıyla aynı kodu çalıştıran hatayı yeniden oluşturabilirsiniz.

Fikir, her derleme yaptığınızda, kodunuzun geçerli revizyon numarasını alan ve projenizdeki bir dosyayı güncelleyen bir komut dosyası çalıştırmanızdır (genellikle bir çeşit belirteç değiştirme ile). Daha sonra, hata çıktısında her zaman revizyon numarasını içeren bir hata işleme rutini yazabilir veya "Hakkında" sayfasında görüntüleyebilirsiniz.


0

Bu yöntemi deneyebilirsiniz:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.