แอพ iphone ของฉันจะตรวจสอบหมายเลขเวอร์ชันของตัวเองได้อย่างไร


254

ฉันกำลังเขียนแอพ iPhone มีการเผยแพร่แล้ว แต่ฉันต้องการเพิ่มคุณสมบัติที่แสดงหมายเลขเวอร์ชัน

ฉันไม่ต้องการทำสิ่งนี้ด้วยตนเองกับแต่ละเวอร์ชันที่ฉันปล่อย ...

มีวิธีในวัตถุประสงค์ -C เพื่อค้นหาเวอร์ชันของแอพของฉันหรือไม่?


1
คำถามนี้ได้รับการตอบแล้วนี่stackoverflow.com/a/16888788/2890157
Akshat Singhal

1
.. คำถามที่เชื่อมโยงคือ 4 ปีต่อมาดังนั้นปัญหาที่แท้จริงที่นี่คือ cmos ไม่เคยยอมรับคำตอบ โดยไม่คำนึงถึงคำตอบของคำถามที่เชื่อมโยงนั้นมีประโยชน์เช่นเดียวกับคำตอบที่นี่ ในทั้งสองหัวข้อให้ดูเกินคำตอบแรก - บางครั้งมีข้อมูลที่เป็นปัจจุบันมากขึ้นสำหรับคำตอบในภายหลัง
ToolmakerSteve

คำตอบ:


222

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

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

ซึ่งจะสร้างสตริงของรูปแบบ "เวอร์ชั่น 1.0 (51)"


152
นั่นส่งคืนเวอร์ชันบิลด์ของฉันดังนั้นฉันจึงใช้อันนี้ [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner

6
CFBundleVersion ไม่ถูกต้องเนื่องจาก Xcode เติมข้อมูลรายการที่ผิดด้วยหมายเลขบิลด์และไม่ใช่หมายเลขเวอร์ชัน jspooner ถูกต้อง
ออสการ์

4
ดูstackoverflow.com/questions/6851660/version-vs-build-in-xcode-4สำหรับคำอธิบายที่ดีเกี่ยวกับหมายเลขเวอร์ชัน vs Build ยืนยันว่าCFBundleShortVersionStringสิ่งที่ปกติคุณต้องการสำหรับ 'รุ่น' และCFBundleVersionหมายเลขสำหรับสร้าง
โรรี่

3
kRevisionNumber ดูเหมือนจะไม่ทำงานสำหรับฉัน เพื่อให้ได้ผลลัพธ์ที่ระบุฉันทำอย่างนี้ (ใช้การแก้ไขของ @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
อดัม

147

จากคำตอบของ 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];
}

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


59

รุ่น 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 นี้ลองดู:

https://github.com/goktugyil/EZSwiftExtensions


42

นี่คือสิ่งที่ฉันทำในใบสมัครของฉัน

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

หวังว่าคำตอบง่ายๆนี้จะช่วยใครซักคน ...


1
สำหรับความต้องการของฉันมันยอดเยี่ยมมาก ขอบคุณ +1
David DelMonte

1
ส่งคืนชื่อ
บิลด์

@chancyWu, CFBundleShortVersionString ปรากฏขึ้นเพื่อให้รุ่น
Brian F Leighty


30

มีสองสิ่ง - สร้างเวอร์ชันและเวอร์ชันแอป

  1. วิธีรับรุ่นแอพ:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. วิธีรับรุ่น Build:

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

มีความแตกต่างระหว่างสองคนนี้ไหม? พวกเขาทั้งสองกลับมาเหมือนกันสำหรับฉัน
jjnevis

ใช่อาจเป็นหมายเลขบิลด์และเวอร์ชันแอปของคุณเหมือนกันในการตั้งค่า
Shaik Riyaz

โอเคฉันมีการตั้งค่าเดียวใน RAKEFILE ของฉัน - app.version (ฉันใช้ RubyMotion) ฉันเดาว่าจะทำตามความต้องการของฉัน ขอบคุณ
jjnevis

ขอบคุณเพื่อน ทำงานได้อย่างราบรื่น
เฟลิเป้

1
FYI เป็นที่นิยมใช้objectForInfoDictionaryKey:มากกว่าinfoDictionary] objectForKey:เพราะในอดีตส่งกลับค่าที่แปลแล้ว (ถ้ามี) อาจจะไม่สร้างความแตกต่างได้ที่นี่;)
deanWombourne

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

1
สิ่งที่ฉันต้องการ!
Julius

16

วิธีที่กระชับเพื่อรับสตริงเวอร์ชันในรูปแบบXYZคือ:

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

หรือสำหรับเพียงXY:

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

ตัวอย่างข้อมูลทั้งสองนี้ส่งคืนสตริงที่คุณจะกำหนดให้กับคุณสมบัติข้อความของวัตถุป้ายผนึกของคุณเช่น

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

7

คุณสามารถลองใช้พจนานุกรมเป็น: -

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

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

4

อ่านไฟล์ info.plist ของแอพของคุณและรับค่าคีย์ CFBundleShortVersionString การอ่าน info.plist จะทำให้วัตถุ NSDictionary


4

คุณสามารถใช้ 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)"
}

3

สวิฟท์ 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♦มาก


1

หากคุณต้องการทั้งสองเวอร์ชันรวมกันและสร้างตัวเลขนี่เป็นวิธีสั้น ๆ โดยใช้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แต่ถ้าคุณกำลังมองหาแบบเต็มรูปแบบ

ฉันหวังว่านี่จะช่วยได้!


1
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โดยไม่ต้องบังคับให้โยนไป


0

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

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


0

คุณสามารถลองวิธีนี้:

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