İOS uygulamasında programlı olarak sürüm / hedef sayısı nasıl görüntülenir?


135

target versionAşağıdaki resimde olduğu gibi, programatik olarak değerini nasıl alabilirim ?

Xcode projemin hedefinin Özellikler penceresinde görüldüğü gibi. Uygulamanın açılış ekranında bunu görüntülemek istiyorum, böylece insanların şu anda hangi sürümü kullandığını biliyorum?

Yanıtlar:


392

Orada 2 Numaraları!

Pazarlama sürüm numarası, sürüm numarası adı verilen müşteriler içindir . 1.0 ile başlar ve 2.0 , 3.0'a yapılan büyük güncellemeler , 1.1 , 1.2'ye yapılan küçük güncellemeler ve 1.0.1 , 1.0.2'ye yapılan hata düzeltmeleri için yükselir . Bu sayı sürümlere ve yeni özelliklere yöneliktir. 9'da durması gerekmez, 1.11.23 makul bir sürüm numarasıdır.

Yapı numarası çoğunlukla inşa dahili numarası o zamana kadar yapılmıştır. Ancak bazıları deponun şube numarası veya taahhüt numarası gibi diğer numaraları kullanır. Bu sayı , yalnızca küçük artımlı değişikliklere sahip farklı yapıları ayırt etmek için benzersiz olmalıdır .


Sürüm numarasını almak için :

Objective-C:

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

Swift <3.0:

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

Swift 3.0+ (5.0 ile test edilmiştir):

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

Yapı numarasını almak için :

Objective-C:

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

Swift <3.0:

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

Swift 3.0+ (5.0'a kadar test edilmiştir):

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

İkisini de bir arada istiyorsanız :

Önce yukarıdaki satırları sonra da sonraki satırları kullanın.

Objective-C:

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

Swift (5.0'a kadar test edildi):

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

Notlar:

Ana paketteki değerler her zaman mevcut değildir, örneğin bir komut satırı uygulamasında CFBundleShortVersionStringveya yoktur CFBundleVersion, bu nedenle yöntemler geri döner nilve kodda yanlış bir downcast oluşturduğu için çökecektir. Ancak normal Kakao iOS ve Mac uygulamalarında bu değerler tanımlanır ve silinmez.

Bu, Xcode Sürüm 7.3 (7D175) ile test edilmiştir . Derleme numarası genellikle parantez / parantez içinde yazılır. Derleme numarası onaltılı veya ondalıktır.

buildandversion


In Xcode Otomatik artımlı olarak yazabilir yapı numarasını bir şekilde ondalık sayı halinde aşağıdaki yerleştirerek Run scriptproje ayarlarında yapım aşamasından

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

İçin onaltılık yapı numarası Bu komut dosyasını kullanmak

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"

Bunun için Xcodeaşağıdakileri yapın:

Aşama 1

Aşama 1

Adım 2

Adım 2

Aşama 3

Aşama 3


4
Sadece yukarıdaki örnek için, "CFBundleVersion" Build = 300, "CFBundleShortVersionString" Sürüm = 0.41'dir. Viktor'un cevabı doğru cevap olmalı.
justinkoh

1
Bir kez onaltılık sayılarla ilgili sorunlar yaşadım. Apple tamsayıları kullanacağını belirtiyor: developer.apple.com/library/ios/documentation/general/Reference/…
hashier

@ "CFBundleShortVersionString" ve @ "CFBundleVersion" için dize sabitleri olup olmadığını biliyor musunuz?
igrek

CI / CD sistemleri oldukça yaygın olduğuna göre, sürüm # 'leri bunlarla ayarlamak için derleme komut dosyalarının kullanılmasının güçlüklerine dikkat çekmek isteyebilirsiniz.
Sam Ballantyne

1
Swift 3.0 için işler yeniden adlandırıldı: Bundle.main.object(forInfoDictionaryKey: "...")şimdi.
Raphael

13

Projenizdeki veya Xcode'unuzdaki hiçbir şeyi değiştirmeniz gerekmez. Her ikisi için ayrı ayrı Swift sürümü:

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

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

https://github.com/goktugyil/EZSwiftExtensions


hangi cevap? i dont see it
Esqarrouth

Sadece bir cevap var, ikinci paragrafında
Daniel Galasko

3
Evet, 1. Cevabında çok fazla gürültü var ve fazla sinyal yok. 2. Bu hızlı, yani objektif-c. 3. ios5 döneminden gelen thats
Esqarrouth

Swift 3.0 için işler yeniden adlandırıldı: Bundle.main.object(forInfoDictionaryKey: "...")şimdi.
Raphael

5

Swift 3 için aynı kod :

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

Bundle.maininfoDictionarybenim için boştu ; belki bir yürütülebilir veya uygulama değil, bir çerçeve içinde yaptığım için? Bundle(for: MyClass.self)beklenen değerleri içerir.
Raphael

4

Programlı olarak sürümü ve sürüm numarasını göster - 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) )"

1

Gibi kullanabilirsiniz

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

Daha sonra Global olarak beyan ettiğiniz her yerde kullanabilirsiniz.

print(appVersion)

Çıktı:

Version: #1.0 (#1.0.3)

1

Bundle için bir uzantı yaptım, böylece kullanımı kolay olacak

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