ฉันกำลังเขียนแอพ iPhone มีการเผยแพร่แล้ว แต่ฉันต้องการเพิ่มคุณสมบัติที่แสดงหมายเลขเวอร์ชัน
ฉันไม่ต้องการทำสิ่งนี้ด้วยตนเองกับแต่ละเวอร์ชันที่ฉันปล่อย ...
มีวิธีในวัตถุประสงค์ -C เพื่อค้นหาเวอร์ชันของแอพของฉันหรือไม่?
ฉันกำลังเขียนแอพ iPhone มีการเผยแพร่แล้ว แต่ฉันต้องการเพิ่มคุณสมบัติที่แสดงหมายเลขเวอร์ชัน
ฉันไม่ต้องการทำสิ่งนี้ด้วยตนเองกับแต่ละเวอร์ชันที่ฉันปล่อย ...
มีวิธีในวัตถุประสงค์ -C เพื่อค้นหาเวอร์ชันของแอพของฉันหรือไม่?
คำตอบ:
ตามที่ฉันอธิบายไว้ที่นี่ฉันใช้สคริปต์เพื่อเขียนไฟล์ส่วนหัวใหม่ด้วยหมายเลขการแก้ไขเวอร์ชันการโค่นล้มปัจจุบันของฉัน หมายเลขการแก้ไขนั้นถูกเก็บไว้ในค่าคงที่ kRevisionNumber ฉันสามารถเข้าถึงรุ่นและหมายเลขการแก้ไขโดยใช้บางอย่างที่คล้ายกับที่แสดงต่อไปนี้:
[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]
ซึ่งจะสร้างสตริงของรูปแบบ "เวอร์ชั่น 1.0 (51)"
CFBundleShortVersionString
สิ่งที่ปกติคุณต้องการสำหรับ 'รุ่น' และCFBundleVersion
หมายเลขสำหรับสร้าง
[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
จากคำตอบของ Brad Larson หากคุณมีข้อมูลรุ่นใหญ่และรุ่นรองที่เก็บไว้ในแผนข้อมูล (เช่นเดียวกับที่ฉันทำในโครงการเฉพาะ) สิ่งนี้ใช้ได้ดีสำหรับฉัน:
- (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];
}
ตอนนี้การแก้ไขเวอร์ชันย่อยด้วยตนเองอาจทำให้เกิดความเจ็บปวดได้ดังนั้นการใช้เคล็ดลับหมายเลขการแก้ไขที่เก็บต้นฉบับจึงเหมาะอย่างยิ่ง หากคุณไม่ได้ผูกไว้ใน (อย่างที่ฉันไม่ได้) ข้อมูลข้างต้นอาจมีประโยชน์ นอกจากนี้ยังดึงชื่อที่แสดงของแอปออกมาด้วย
รุ่น Swift สำหรับทั้งสองแยกจากกัน:
สวิฟท์ 3
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String
สวิฟท์ 2
let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String
มันรวมอยู่ใน repo นี้ลองดู:
นี่คือสิ่งที่ฉันทำในใบสมัครของฉัน
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
หวังว่าคำตอบง่ายๆนี้จะช่วยใครซักคน ...
คุณสามารถระบุCFBundleShortVersionString
สตริงใน plist.info ของคุณและอ่านโปรแกรมนั้นโดยใช้API ที่ให้มา
มีสองสิ่ง - สร้างเวอร์ชันและเวอร์ชันแอป
วิธีรับรุ่นแอพ:
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
วิธีรับรุ่น Build:
NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
objectForInfoDictionaryKey:
มากกว่าinfoDictionary] objectForKey:
เพราะในอดีตส่งกลับค่าที่แปลแล้ว (ถ้ามี) อาจจะไม่สร้างความแตกต่างได้ที่นี่;)
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
วิธีที่กระชับเพื่อรับสตริงเวอร์ชันในรูปแบบXYZคือ:
[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]
หรือสำหรับเพียงXY:
[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]
ตัวอย่างข้อมูลทั้งสองนี้ส่งคืนสตริงที่คุณจะกำหนดให้กับคุณสมบัติข้อความของวัตถุป้ายผนึกของคุณเช่น
myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
คุณสามารถลองใช้พจนานุกรมเป็น: -
NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];
NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
อ่านไฟล์ info.plist ของแอพของคุณและรับค่าคีย์ CFBundleShortVersionString การอ่าน info.plist จะทำให้วัตถุ NSDictionary
คุณสามารถใช้ infoDictionary ที่รับรายละเอียดเวอร์ชั่นได้จาก info.plist ของแอพ รหัสนี้ใช้ได้กับ swift 3 เพียงแค่เรียกวิธีนี้และแสดงเวอร์ชันในองค์ประกอบ UI ที่ต้องการ
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)"
}
สวิฟท์ 5:
มีสองสิ่ง - รุ่นแอปและรุ่นบิลด์
วิธีรับรุ่นแอพ:
if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
// present appVersion
}
วิธีรับรุ่น Build:
if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
// present buildVersion
}
ขอบคุณ@Brad Larson♦
มาก
หากคุณต้องการทั้งสองเวอร์ชันรวมกันและสร้างตัวเลขนี่เป็นวิธีสั้น ๆ โดยใช้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)"
เพิ่มas! String
ไปยังจุดสิ้นสุดของบรรทัดappVersion
หรือbuildNum
เพื่อให้ได้เฉพาะส่วนนั้นเป็นString
วัตถุ ไม่จำเป็นต้องมีแม้ว่าถ้าคุณกำลังมองหาแบบเต็มversionInfo
แต่ถ้าคุณกำลังมองหาแบบเต็มรูปแบบ
ฉันหวังว่านี่จะช่วยได้!
func getAppVersion() -> String {
let dictionary = Bundle.main.infoDictionary!
let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
let buildValue = dictionary["CFBundleVersion"] ?? "0"
return "\(versionValue) (build \(buildValue))"
}
ขึ้นอยู่กับคำตอบ @rajat chauhan String
โดยไม่ต้องบังคับให้โยนไป
นี่เป็นสิ่งที่ดีที่จะจัดการกับระบบควบคุมการแก้ไข ด้วยวิธีนี้เมื่อคุณได้รับรายงานข้อผิดพลาดจากผู้ใช้คุณสามารถตรวจสอบการแก้ไขรหัสและ (หวังว่า) จะสร้างข้อผิดพลาดขึ้นใหม่โดยใช้รหัสเดียวกันกับผู้ใช้
แนวคิดคือทุกครั้งที่คุณสร้างบิลด์คุณจะเรียกใช้สคริปต์ที่ได้รับหมายเลขการแก้ไขปัจจุบันของรหัสและอัปเดตไฟล์ภายในโครงการของคุณ (โดยปกติจะมีการเปลี่ยนโทเค็นบางรูปแบบ) จากนั้นคุณสามารถเขียนชุดคำสั่งการจัดการข้อผิดพลาดที่มีหมายเลขการแก้ไขในผลลัพธ์ข้อผิดพลาดหรือคุณสามารถแสดงในหน้า "เกี่ยวกับ"
คุณสามารถลองวิธีนี้:
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];