İ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.