มีวิธีในการรับรุ่นบิลด์ของแอพของฉันโดยทางโปรแกรมหรือไม่ ฉันต้องสามารถตรวจจับได้เมื่อผู้ใช้อัปเดตแอปผ่าน AppStore เพื่อรันโค้ดบางอย่างสำหรับการปรับค่าใช้จ่าย
มีวิธีในการรับรุ่นบิลด์ของแอพของฉันโดยทางโปรแกรมหรือไม่ ฉันต้องสามารถตรวจจับได้เมื่อผู้ใช้อัปเดตแอปผ่าน AppStore เพื่อรันโค้ดบางอย่างสำหรับการปรับค่าใช้จ่าย
คำตอบ:
ค่าที่คุณตั้งค่าในฟิลด์ "เวอร์ชั่น" ของการสรุปเป้าหมาย 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
NSBundle.mainBundle()
ตอนนี้Bundle.main
คุณสามารถลองใช้ infoDictionary
NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];
NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey];
เมื่อใช้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];
นี่คือผลลัพธ์เมื่อได้รับข้อความ:
รุ่น Swift สำหรับทั้งสองแยกจากกัน:
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
มันรวมอยู่ใน repo นี้ลองดู:
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) ในการรับเวอร์ชั่นของแอปคุณต้องใช้:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
2) ในการรับเวอร์ชั่น Build คุณต้องใช้:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];