İOS projemin geçerli sürümünü kodda nasıl edinebilirim?


151

NSStringBir yerde dosyadaki bir sabiti tanımlamak zorunda kalmadan iOS projemin / uygulamamın mevcut sürümünü bir nesne olarak almak istiyorum. Sürüm değerimi 2 yerde değiştirmek istemiyorum.

Sürümümü Proje hedef özetinde çarptığımda değerin güncellenmesi gerekiyor.

Yanıtlar:


381

Sürümü ve derleme sayılarını aşağıdaki gibi alabilirsiniz:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String

veya Objective-C'de

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];

Bir kategoride aşağıdaki yöntemleri var UIApplication:

extension UIApplication {

    static var appVersion: String {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    }

    static var appBuild: String {
        return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
    }

    static var versionBuild: String {
        let version = appVersion, build = appBuild            
        return version == build ? "v\(version)" : "v\(version)(\(build))"
    }
}

Gist: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Objective-C'deki karşılığı:

+ (NSString *) appVersion
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];    
}

+ (NSString *) build
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}

+ (NSString *) versionBuild
{
    NSString * version = [self appVersion];
    NSString * build = [self build];

    NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];

    if (![version isEqualToString: build]) {
        versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
    }

    return versionBuild;
}

Gist: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
[[NSBundle mainBundle] nesnesiForInfoDictionaryKey: (NSString *) kCFBundleVersionKey] yerine bu [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] kullanabilirsiniz. ]; Şimdi bellekte tutmak kolay oldu
Durai Amuthan.H

4
@Duraiamuthan kullanmak (NSString *)kCFBundleVersionKeyyerine tavsiye ederim @"CFBundleVersion". Yazmak daha uzun olsa da (otomatik tamamlama burada yardımcı olacaktır), çünkü derleme zamanında kontrol edilen bir sabittir.
Ashley Mills

Btw, bu uzantıyı NSBundlebunun yerine yapmak daha doğru olur, bunun UIApplicationyerine statik çağrıların örnek olanlarla değiştirilmesine de izin verir.
Zapko

@Zapko - Saygılarımla katılmıyorum. Kavramsal olarak bu UIApplication, geri dönen bilgiler uygulama hakkında olduğu için uygundur. Ayrıca, bu sadece mainpaket için geçerlidir - bunu herhangi bir paket üzerinde bir örnek yöntemi yapmak mantıklı olmaz.
Ashley Mills

Şunu mu demek istediniz builddediğin zaman appBundle(kodunuzun 2.satır)?
user1046037

14

İşte Xcode 8, Swift 3'te çalışanlar :

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

print("Version: \(gAppVersion)")
print("Build: \(gAppBuild)")

3

Hedef C:

1) Uygulama sürümünü almak için aşağıdakileri kullanmanız gerekir:

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

2) Derleme sürümünü almak için aşağıdakileri kullanmanız gerekir:

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

1

Swift'te paket sürümünü aşağıdakileri kullanarak alabilirsiniz:

let info:NSDictionary = NSBundle.mainBundle().infoDictionary!

let version:String = info.objectForKey("CFBundleShortVersionString") as! String

versionLabel.text = "Version:" + version

0

Açık kaynaklı bir projem olan App Update Tracker , bu işlevselliği (ve daha fazlasını) sınıf yöntemleri şeklinde sunuyor:

  • + (NSString *)getShortVersionString
  • + (NSString *)getLongVersionString

Bunu şöyle kullanırsınız:

#import "AppUpdateTracker.h"

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);

0

Sadece not için

Herhangi bir anahtarın yerelleştirilmiş değerini elde etmek için CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Bu nedenle, her ikisi için ayrı ayrı bir Swift sürümü vardır:

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


CFBundleVersionKey artık Xcode 8 ve Swift 3'te çalışmıyor. Yeni anahtarı biliyor musunuz?
Crashalot

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.