แอป iOS โดยทางโปรแกรมจะมีรุ่นบิลด์


127

มีวิธีในการรับรุ่นบิลด์ของแอพของฉันโดยทางโปรแกรมหรือไม่ ฉันต้องสามารถตรวจจับได้เมื่อผู้ใช้อัปเดตแอปผ่าน AppStore เพื่อรันโค้ดบางอย่างสำหรับการปรับค่าใช้จ่าย



คำตอบ:


284

ค่าที่คุณตั้งค่าในฟิลด์ "เวอร์ชั่น" ของการสรุปเป้าหมาย Xcode อยู่ที่นี่:

สวิฟท์ 3

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

ObjC

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

สวิฟท์ 2

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

และ "สร้าง":

สวิฟท์ 3

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

ObjC

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

สวิฟท์ 2

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

5
การใช้สตริงตัวอักษรและไม่ใช่ค่าคงที่ไม่ได้เป็นหลักฐานในอนาคต เห็นคำตอบของ Anupdas สำหรับปุ่มคงที่
Aaron Brager

9
คุณเหมาะสมสำหรับ @ "CFBundleVersion" - ฉันได้แก้ไขคำตอบของฉันแล้ว อย่างไรก็ตามสำหรับ @ "CFBundleShortVersionString" ไม่มี AFAIK คงที่
e1985

สำหรับ Swift NSBundle.mainBundle()ตอนนี้Bundle.main
Todd

85

คุณสามารถลองใช้ infoDictionary

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

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

13
kCFBundleVersionKey คือ 'รุ่น' ไม่ 'รุ่น'
powerj1984

11

เมื่อใช้MFMailComposeViewControllerสำหรับปุ่ม "ติดต่อเรา" ฉันใช้รหัสนี้เพื่อรับ HTML ที่มีการจัดรูปแบบในอีเมลจากผู้ใช้ มันให้ข้อมูลทั้งหมดที่ฉันต้องการเพื่อเริ่มช่วยแก้ไขปัญหาใด ๆ :

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

นี่คือผลลัพธ์เมื่อได้รับข้อความ:

ป้อนคำอธิบายรูปภาพที่นี่


3

รุ่น Swift สำหรับทั้งสองแยกจากกัน:

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

มันรวมอยู่ใน repo นี้ลองดู:

https://github.com/goktugyil/EZSwiftExtensions


คุณควรทำให้ชัดเจนว่าคุณเป็นเจ้าของธุรกรรมซื้อคืนนั้น คุณไม่ต้องการออกมาเป็นผู้ส่งสแปม
JAL

2

รายละเอียด

  • Xcode เวอร์ชั่น 10.3 (10G8), Swift 5

สารละลาย

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 }
}

การใช้

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

ผลลัพธ์

การตั้งค่าโครงการ

ป้อนคำอธิบายรูปภาพที่นี่


1

ฉันได้เขียนโครงการโอเพนซอร์ซนี้เพื่อจุดประสงค์นี้อย่างแม่นยำ โครงการของฉันโพสต์การแจ้งเตือนเมื่อมีเหตุการณ์สำคัญเกิดขึ้นเช่นเมื่อผู้ใช้เปิดแอปเป็นครั้งแรกหรือเปิดแอปหลังจากอัปเกรด (กรอกข้อมูลที่เวอร์ชันที่ผู้ใช้อัปเกรด) แหล่งที่มาตรงไปตรงมาและควรจะเข้าใจง่าย แจ้งให้เราทราบหากคุณมีคำถาม / คำขอ

ฉันเพิ่งเขียนโพสต์บล็อกเกี่ยวกับเรื่องนี้


1

1) ในการรับเวอร์ชั่นของแอปคุณต้องใช้:

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

2) ในการรับเวอร์ชั่น Build คุณต้องใช้:

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.