Làm cách nào để hiển thị phiên bản / số bản dựng mục tiêu trong ứng dụng iOS?


135

Làm thế nào tôi có thể lập trình nhận được giá trị của target version, như trong hình dưới đây?

Như đã thấy trong cửa sổ Thuộc tính của mục tiêu dự án Xcode của tôi. Tôi muốn hiển thị cái này trong màn hình giật gân của ứng dụng của mình để tôi biết phiên bản nào mọi người hiện đang sử dụng?

Câu trả lời:


392

2 số!

Số phát hành tiếp thị dành cho khách hàng, được gọi là số phiên bản . Nó bắt đầu với 1.0 và tăng các bản cập nhật lớn lên 2.0 , 3.0 , cho các bản cập nhật nhỏ lên 1.1 , 1.2 và sửa lỗi cho 1.0.1 , 1.0.2 . Con số này được định hướng về phát hành và các tính năng mới. Nó không phải dừng lại ở 9, 1.11,23 là một số phiên bản hợp lý.

Số bản dựng chủ yếu là số bản dựng của bản dựng đã được tạo cho đến lúc đó. Nhưng một số sử dụng các số khác như số nhánh của kho lưu trữ hoặc số cam kết của nó. Số này phải là duy nhất để phân biệt các bản dựng khác nhau, chỉ có các thay đổi gia tăng nhỏ.


Để có được số phiên bản :

Mục tiêu-C:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Swift <3.0:

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (đã thử nghiệm với 5.0):

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Để có được dựng :

Mục tiêu-C:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Swift <3.0:

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

Swift 3.0+ (đã thử nghiệm cho đến 5.0):

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

Nếu bạn muốn cả hai trong một:

Đầu tiên sử dụng các dòng trên và sau đó một dòng sau.

Mục tiêu-C:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Swift (đã thử nghiệm cho đến 5.0):

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Ghi chú:

Các giá trị trong gói chính không phải lúc nào cũng có mặt, ví dụ trong ứng dụng dòng lệnh không có CFBundleShortVersionStringhoặc CFBundleVersion, vì vậy các phương thức sẽ trả vềnil và nó sẽ bị sập vì trong mã nó tạo ra một luồng không chính xác. Nhưng trong các ứng dụng Cacao và iOS bình thường, các giá trị này được xác định và sẽ không bị xóa.

Điều này được thử nghiệm với Xcode Phiên bản 7.3 (7D175) . Số bản dựng thường được viết bằng dấu ngoặc đơn / dấu ngoặc nhọn. Số bản dựng ở dạng thập lục phân hoặc thập phân.

xây dựng


Trong Xcode bạn có thể tự động tăng các số xây dựng như một số thập phân bằng cách đặt những điều sau đây trong Run scriptgiai đoạn xây dựng trong các thiết lập dự án

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Đối với số bản dựng thập lục phân, sử dụng tập lệnh này

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Dành cho Xcode làm như sau:

Bước 1

bước 1

Bước 2

bước 2

Bước 3

bước 3


4
Chỉ cần thêm vào ví dụ trên, "CFBundleVersion" là Build = 300, "CFBundleShortVersionString" là Phiên bản = 0.41. Câu trả lời của Viktor phải là câu trả lời đúng.
justinkoh

1
Tôi đã có vấn đề với số hex một lần. Apple tuyên bố sẽ sử dụng các số nguyên: developer.apple.com/l
Library / ios / document / generic / Reference / Lỗi

Bạn có biết nếu có bất kỳ hằng chuỗi nào cho @ "CFBundleShortVersionString" và @ "CFBundleVersion" không?
igrek

Bây giờ các hệ thống CI / CD khá phổ biến, bạn có thể muốn chỉ ra những cạm bẫy của việc sử dụng tập lệnh xây dựng để đặt phiên bản # với các phiên bản đó.
Sam Ballantyne

1
Mọi thứ đã được đổi tên cho Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")bây giờ.
Raphael

13

Bạn không cần thay đổi bất cứ điều gì trong dự án hoặc Xcode của bạn. Đây là 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ó được bao gồm trong repo này, hãy kiểm tra xem:

https://github.com/goktugyil/EZSwiftExtensions


câu trả lời nào? tôi không thấy nó
Esqarrouth

Chỉ có một câu trả lời, đó là trong đoạn thứ hai của anh ấy
Daniel Galasko

3
Vâng, 1. Có quá nhiều tiếng ồn và không có nhiều tín hiệu trong câu trả lời của anh ấy. 2. Đây là nhanh chóng, đó là mục tiêu - c. 3. Đó là từ thời ios5
Esqarrouth

Mọi thứ đã được đổi tên cho Swift 3.0: Bundle.main.object(forInfoDictionaryKey: "...")bây giờ.
Raphael

5

Đây là mã tương tự cho Swift 3 :

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

Bundle.maincó một khoảng trống infoDictionarycho tôi; có lẽ bởi vì tôi đang làm nó từ trong một khung, không phải là ứng dụng hay ứng dụng? Bundle(for: MyClass.self)chứa các giá trị mong đợi.
Raphael

4

Phiên bản hiển thị theo chương trình và số bản dựng - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

1

Bạn cũng có thể sử dụng như

var appVersion: String {
  //versionNumber
  let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

  //buildNumber
  let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"

  return "Version: #\(versionNumber) (#\(buildNumber))"
}

Sau đó, bạn có thể sử dụng bất cứ nơi nào khi bạn tuyên bố toàn cầu.

print(appVersion)

Đầu ra:

Version: #1.0 (#1.0.3)

1

Tôi đã tạo một tiện ích mở rộng cho Bundle để nó dễ sử dụng

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}
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.