Ứng dụng iOS, lập trình có phiên bản xây dựng


Câu trả lời:


284

Giá trị bạn đặt trong trường "Phiên bản" của tóm tắt mục tiêu Xcode nằm ở đây:

Swift 3

let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

ObjC

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

Swift 2

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as! String

và "Xây dựng":

Swift 3

let build = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String

ObjC

NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

Swift 2

let build = NSBundle.mainBundle().infoDictionary?[kCFBundleVersionKey as String] as! String

5
Sử dụng chuỗi bằng chữ và không phải là hằng số không phải là bằng chứng trong tương lai; xem câu trả lời của Anupdas cho các phím không đổi.
Aaron Brager

9
Bạn phù hợp với @ "CFBundleVersion" - Tôi đã chỉnh sửa câu trả lời của mình. Tuy nhiên, đối với @ "CFBundleShortVersionString" không có AFAIK không đổi.
e1985

Đối với Swift, NSBundle.mainBundle()bây giờBundle.main
Todd

85

Bạn có thể thử sử dụng thông tin từ điển

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

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 

13
kCFBundleVersionKey là phiên bản 'xây dựng' chứ không phải '
powerj1984

11

Khi sử dụng MFMailComposeViewControllernút "Liên hệ với chúng tôi", tôi sử dụng mã này để nhận HTML được định dạng trên e-mail từ người dùng. Nó cung cấp cho tôi tất cả thông tin mà tôi cần để bắt đầu giúp giải quyết mọi vấn đề:

struct utsname systemInfo;
uname(&systemInfo);

NSDateFormatter *formatter = [[NSDateFormatter alloc]  init];
NSDate  *date = [NSDate date];
[formatter setDateFormat:@"MM/dd/yyyy 'at' hh:mm a"];
NSString *dateString = [formatter stringFromDate:date];

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width - 65.0;

NSString *comments = NSLocalizedString(@"Please write your comments below:", nil);
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];

NSString *emailBody = [NSString stringWithFormat:@"<!DOCTYPE html><html><style> .div {background-color: lightgrey; width: %fpx; padding: 10px; border: 5px solid navy; margin: 2px;}</style><body><div class='div'><p><b>App:</b> %@</p><b><p>Device:</b> %@</p><b><p>iOS Version:</b> %@</p><b><p><p>App Version and Build:</b> %@ (%@)</p><b><p>Date:</b> %@</p> </p></div><font color='red'><b>%@</b></font><br><br></body></html>",screenWidth,appName,deviceModel,iOSVersion,version,build,dateString,comments];

[self setMessageBody:emailBody isHTML:YES];

Đây là kết quả khi nhận được tin nhắn:

nhập mô tả hình ảnh ở đây


3

Phiên bản Swift cho cả hai 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


Bạn nên làm rõ rằng bạn sở hữu repo đó. Bạn không muốn trở thành một người gửi thư rác.
JAL

2

Chi tiết

  • Phiên bản Xcode 10.3 (10G8), Swift 5

Giải pháp

class Info {
    static let dictionary = Bundle.main.infoDictionary ?? [:]
    enum Value {
        case build, version
    }
}

extension Info.Value {

    var key: String {
        switch self {
            case .build: return kCFBundleVersionKey as String
            case .version: return kCFBundleInfoDictionaryVersionKey as String
        }
    }

    var string: String? { return Info.dictionary[key] as? String }
}

Sử dụng

if let value = Info.Value.version.string { print("Version: \(value)") }
if let value = Info.Value.build.string { print("Build: \(value)") }

Kết quả

Thiết lập dự án

nhập mô tả hình ảnh ở đây


1

Tôi đã viết dự án nguồn mở này cho chính xác mục đích này. Dự án của tôi đăng thông báo khi có sự kiện quan trọng xảy ra, chẳng hạn như khi người dùng mở ứng dụng lần đầu tiên hoặc mở ứng dụng sau khi nâng cấp (hoàn tất thông tin về phiên bản mà người dùng đã nâng cấp từ đó). Nguồn này rất đơn giản và dễ hiểu. Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi / yêu cầu.

Gần đây tôi cũng đã viết một bài blog về nó.


1

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"];
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.