Làm cách nào để ứng dụng iphone của tôi phát hiện số phiên bản của chính nó?


254

Tôi đang viết một ứng dụng cho iPhone. Nó đã được xuất bản, nhưng tôi muốn thêm một tính năng hiển thị số phiên bản của nó.

Tôi không muốn phải làm điều này bằng tay với mỗi phiên bản tôi phát hành ...

Có cách nào trong mục tiêu-C để tìm ra phiên bản của ứng dụng của tôi không?


1
Câu hỏi này đã được trả lời ở đây stackoverflow.com/a/16888788/2890157 .
Akshat Singhal

1
.. câu hỏi được liên kết là 4 năm sau, vì vậy vấn đề thực sự ở đây là cmos không bao giờ chấp nhận câu trả lời. Bất kể, câu trả lời của câu hỏi được liên kết là hữu ích, cũng như câu trả lời ở đây. Trên cả hai chủ đề, hãy nhìn xa hơn câu trả lời đầu tiên - đôi khi có nhiều thông tin cập nhật hơn về câu trả lời sau.
ToolmakerSteve

Câu trả lời:


222

Như tôi mô tả ở đây , tôi sử dụng một tập lệnh để viết lại một tệp tiêu đề với số sửa đổi Subversion hiện tại của tôi. Số sửa đổi đó được lưu trữ trong hằng số kRevisionNumber. Sau đó tôi có thể truy cập phiên bản và số sửa đổi bằng cách sử dụng nội dung tương tự như sau:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

sẽ tạo ra một chuỗi định dạng "Phiên bản 1.0 (51)".


152
Điều đó đã trả về phiên bản xây dựng của tôi vì vậy tôi đã sử dụng phiên bản này. [[[NSBundle mainBundle] infoDixi] objectForKey: @ "CFBundleShortVersionString"]
jspooner

6
CFBundleVersion không chính xác, vì Xcode đã điền nhầm mục nhập đó với số bản dựng chứ không phải số phiên bản. jspooner là chính xác.
Oscar

4
Xem stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 để biết giải thích tuyệt vời về số Phiên bản so với bản dựng. Xác nhận rằng CFBundleShortVersionStringnhững gì bạn thường muốn cho 'phiên bản' và CFBundleVersioncho Số bản dựng.
Rory

3
kRevisionNumber dường như không làm việc cho tôi. Để có được đầu ra được chỉ định, tôi đã làm điều này (sử dụng bản sửa lỗi của @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam

147

Dựa trên câu trả lời của Brad Larson, nếu bạn có thông tin phiên bản chính và phụ được lưu trữ trong phần thông tin (như tôi đã làm trong một dự án cụ thể), điều này hoạt động tốt với tôi:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Bây giờ việc chỉnh sửa một phiên bản nhỏ bằng tay có thể là một nỗi đau, và vì vậy sử dụng thủ thuật số sửa đổi kho lưu trữ nguồn là lý tưởng. Nếu bạn chưa gắn nó vào (như tôi đã không), đoạn trích trên có thể hữu ích. Nó cũng lấy ra tên hiển thị của ứng dụng.


59

Phiên bản Swift cho cả hai riêng biệt:

Swift 3

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

Swift 2

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


42

Đây là những gì tôi đã làm trong ứng dụng của mình

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

Hy vọng câu trả lời đơn giản này sẽ giúp được ai đó ...


1
Đối với nhu cầu của tôi, điều này là tuyệt vời. Cảm ơn. +1
David DelMonte

1
Điều này trả về tên bản dựng, không phải phiên bản
chancyWu

@chancyWu, CFBundleShortVersionString xuất hiện để cung cấp phiên bản.
Brian F Leighty


30

Có hai điều - phiên bản xây dựng và phiên bản ứng dụng.

  1. Để có phiên bản Ứng dụng:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Để có phiên bản Build:

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

Có sự khác biệt nào giữa hai điều này không? Cả hai đều trả lại giống nhau cho tôi.
jjnevis

có, có thể là số bản dựng và phiên bản ứng dụng của bạn giống nhau trong cài đặt.
Shaik Riyaz

Được rồi, tôi chỉ có một cài đặt trong RAKEFILE - app.version (Tôi đang sử dụng RubyMotion). Tôi đoán một trong hai sẽ làm cho nhu cầu của tôi. Cảm ơn
jjnevis 19/03/2015

Cảm ơn, bạn đời. Làm việc suôn sẻ.
Felipe

1
FYI Nên sử dụng objectForInfoDictionaryKey:thay infoDictionary] objectForKey:vì vì trước đây trả về giá trị nội địa hóa (nếu có). Có lẽ sẽ không tạo ra sự khác biệt ở đây;)
deanWombourne

17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];

1
Chính xác những gì tôi cần!
Julius

16

Một cách ngắn gọn để có được chuỗi phiên bản ở định dạng XYZ là:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Hoặc, chỉ cho XY:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

Cả hai đoạn mã này trả về các chuỗi mà bạn sẽ gán cho thuộc tính văn bản của đối tượng nhãn của mình, ví dụ:

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];

7

Bạn có thể thử sử dụng từ điển như: -

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]

4

Đọc tệp info.plist của ứng dụng của bạn và nhận giá trị cho khóa CFBundleShortVersionString. Đọc thông tin.plist sẽ cung cấp cho bạn một đối tượng NSDipedia


4

Bạn có thể sử dụng thông tin từ điển thông tin lấy thông tin chi tiết về phiên bản từ info.plist của ứng dụng bạn. Mã này hoạt động cho swift 3. Chỉ cần gọi phương thức này và hiển thị phiên bản trong bất kỳ thành phần UI ưa thích nào.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}

3

Swift 5:

Có hai điều - Phiên bản ứng dụng và phiên bản xây dựng

  • Để có phiên bản Ứng dụng:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Để có phiên bản Build:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Cảm ơn @Brad Larson♦rất nhiều


1

Nếu bạn cần kết hợp cả hai phiên bản xây dựng num , đây là một cách ngắn gọn bằng Swift 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Thêm một as! Stringđến cuối một trong hai appVersionhoặc buildNumdòng để có được duy nhất mà phần như một Stringđối tượng. Không cần điều đó mặc dù nếu bạn đang tìm kiếm đầy đủ versionInfo.

Tôi hi vọng cái này giúp được!


1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Dựa trên câu trả lời @rajat chauhan mà không bị ép buộc String.


0

Đây là một điều tốt để xử lý với một hệ thống kiểm soát sửa đổi. Bằng cách đó, khi bạn nhận được báo cáo lỗi từ người dùng, bạn có thể kiểm tra sửa đổi mã đó và (hy vọng) tái tạo lỗi chạy mã chính xác như người dùng.

Ý tưởng là mỗi khi bạn thực hiện một bản dựng, bạn sẽ chạy một tập lệnh lấy số sửa đổi hiện tại của mã của bạn và cập nhật một tệp trong dự án của bạn (thường là với một số hình thức thay thế mã thông báo). Sau đó, bạn có thể viết thói quen xử lý lỗi luôn bao gồm số sửa đổi trong đầu ra lỗi hoặc bạn có thể hiển thị nó trên trang "Giới thiệu".


0

Bạn có thể thử phương pháp này:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
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.