Làm cách nào để có được phiên bản hiện tại của dự án iOS của tôi bằng mã?


151

Tôi muốn có thể lấy phiên bản hiện tại của dự án / ứng dụng iOS của mình làm NSStringđối tượng mà không phải xác định hằng số trong tệp ở đâu đó. Tôi không muốn thay đổi giá trị phiên bản của mình ở 2 nơi.

Giá trị cần được cập nhật khi tôi nâng cấp phiên bản của mình trong bản tóm tắt mục tiêu dự án.

Câu trả lời:


381

Bạn có thể lấy phiên bản và xây dựng số như sau:

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

hoặc trong Mục tiêu-C

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

Tôi có các phương pháp sau trong một danh mục trên 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


Đây là tương đương trong Objective-C:

+ (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
Bạn có thể sử dụng đối tượng [[NSBundle mainBundle] nàyForInfoDixiKey: @ "CFBundleVersion"] thay vì [[NSBundle mainBundle] objectForInfoDixiKey: (NSString *) là đối tượng của nó ]; Vì vậy, bây giờ nó đã trở nên dễ dàng để giữ trong bộ nhớ
Durai Amuthan.H

4
@Duraiamuthan Tôi khuyên bạn nên sử dụng (NSString *)kCFBundleVersionKeychứ không phải @"CFBundleVersion". Mặc dù việc nhập lâu hơn (tự động hoàn thành sẽ giúp ích ở đây), vì nó là hằng số được kiểm tra tại thời gian biên dịch.
Ashley Mills

Btw, sẽ chính xác hơn để thực hiện tiện ích mở rộng này NSBundlethay vì UIApplicationđiều này cũng sẽ cho phép thay thế các cuộc gọi tĩnh bằng các cuộc gọi cá thể.
Zapko

@Zapko - Tôi không đồng ý. Về mặt khái niệm, điều này phù hợp với UIApplication, vì thông tin trả về là về ứng dụng. Ngoài ra, điều này chỉ áp dụng cho maingói - sẽ không có ý nghĩa gì khi biến phương thức này thành một phương thức cá thể trên bất kỳ gói nào.
Ashley Mills

Ý bạn là buildkhi bạn nói appBundle(trong dòng thứ 2 của mã của bạn)?
dùng1046037

14

Đây là những gì đã hoạt động trên Xcode 8, Swift 3:

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

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

3

Trong mục tiêu C:

1) Để nhận phiên bản Ứng dụng, bạn phải sử dụng:

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

2) Để có phiên bản Build, bạn phải sử dụng:

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

1

Trong Swift, bạn có thể nhận phiên bản gói bằng cách sử dụng:

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

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

versionLabel.text = "Version:" + version

0

Một dự án nguồn mở của tôi, Trình cập nhật ứng dụng , cung cấp chức năng này (và hơn thế nữa) dưới dạng các phương thức lớp:

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

Bạn sẽ sử dụng nó như vậy:

#import "AppUpdateTracker.h"

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

0

Chỉ cần lưu ý

Để có được giá trị nội địa hóa của bất kỳ khóa nào, bạn nên sử dụng CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Vì vậy, đây là phiên bản Swift cho cả hai cách riêng biệt:

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

Nó bao gồm trong repo này, kiểm tra xem nó:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey không còn hoạt động trên Xcode 8 và Swift 3. Bạn có biết khóa mới không?
Crashalot

Đây là một cập nhật mới: github.com/goktugyil/EZSwiftExtensions/blob/
mẹo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.