การรับข้อมูลเวอร์ชันและการสร้างด้วย Swift


92

ฉันกำลังพยายามเข้าถึง Main NSBundle เพื่อดึงข้อมูล Version และ Build สิ่งนี้คือฉันต้องการลองอย่างรวดเร็วฉันรู้วิธีดึงข้อมูลใน Objective-C ด้วยBuild.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];. แต่ฉันไม่รู้ว่าจะเริ่มต้นด้วยความรวดเร็วตรงไหนฉันได้พยายามเขียนมันลงในไวยากรณ์ใหม่โดยไม่มีประโยชน์


2
แสดงความพยายามที่คุณทำไปแล้ว คล้ายกับการใช้งาน Objective-C มาก
Mick MacCallum

ม.ค. 2017 swift 2.3: ให้ sVer = NSBundle.mainBundle (). infoDictionary? ["CFBundleShortVersionString"] เป็น? String ให้ sBuild = NSBundle.mainBundle (). infoDictionary? ["CFBundleVersion"] เป็น? String self.myVersionLabel.text = String (รูปแบบ: "Version% @ Build% @", sVer !, sBuild!)
Matthew Ferguson

คำตอบ:


167

ไวยากรณ์ Swift มีอะไรผิดปกติ ดูเหมือนว่าจะได้ผล:

if let text = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
    print(text)
}

2
เหตุใดจึงถูกลดลง ฉันเดาว่ามันอาจจะดูเป็นธรรมชาติมากกว่าletแต่มันก็ดูถูกต้อง
Tommy

อ่าฉันลืม "as String" ดังนั้นตัวแปรจึงยอมรับเป็นสตริง ขอบคุณ.
Ken-UbiDex

2
ดูเหมือนว่าจะเสียด้วย XCode 6 beta 3
Frédéric Adda

2
สิ่งนี้ใช้ได้ผลสำหรับฉันใน Xcode 6 beta 5:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
E. Barnes

@ ดีนดูเหมือนว่าพวกเขาเปลี่ยน infoDictionary เพื่อส่งคืนตัวเลือก ฉันแก้ไขคำตอบแล้ว
Connor

118

เวอร์ชัน Swift 3/4

func version() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "\(version) build \(build)"
} 

เวอร์ชัน Swift 2.x

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as String
    let build = dictionary["CFBundleVersion"] as String
    return "\(version) build \(build)"
}

เท่าที่เห็นนี่


1
คุณได้รับคีย์เดียวกันสองครั้งควรใช้ "CFBundleVersion" สำหรับเวอร์ชัน ฉันเดาว่าเป็นสำเนา / พิมพ์ผิดในอดีต :)
foOg

ขอบคุณ @foOg มันพิมพ์ผิด ในความเป็นจริงมันถอยหลัง: แบบสั้นคือเวอร์ชันปกติคือบิลด์ แปลกฉันรู้
Dan Rosenstark

เวอร์ชัน Swift 3 ถ้าให้ infoPath = Bundle.main.path (forResource: "Info.plist", ofType: nil) ให้ infoAttr = ลอง? FileManager.default.attributesOfItem (atPath: infoPath) ให้ infoDate = infoAttr [.creationDate] เป็น? วันที่ {return infoDate} return Date ()
Ryan X

18

สำหรับการใช้งาน Xcode 6 รุ่นสุดท้าย

NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String

ตัว "?" อักขระหลัง infoDictionary มีความสำคัญที่นี่


1
ประณาม. ฉันแน่ใจว่ารักสิ่งนี้ทั้งหมด "ไม่บังคับ? แกะ!" ระบบมันใสและอ่านง่ายมาก!
Jeroen Bouma

14

นี่คือวิธีง่ายๆในการสร้างและเวอร์ชัน

สำหรับ Swift 4.X

 if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
     print(version)
   }

 if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
     print(build)
   }

สำหรับวัตถุประสงค์ค

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

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

โปรดแจ้งให้เราทราบหากมีปัญหาใด ๆ นี่ใช้งานได้สำหรับฉัน


13

วิธี Swifty สำหรับAppName, AppVersionและBuildNumber...

if let dict = NSBundle.mainBundle().infoDictionary {
   if let version = dict["CFBundleShortVersionString"] as? String,
       let bundleVersion = dict["CFBundleVersion"] as? String,
       let appName = dict["CFBundleName"] as? String {
           return "You're using \(appName) v\(version) (Build \(bundleVersion))."
   }
}

ทำไมคุณต้องแกะค่าต่างๆ สำหรับความรู้ของฉันมันเป็นไปไม่ได้ที่ค่าใด ๆ เหล่านั้นจะเป็นศูนย์
Michael

@ ไมเคิลบางคนมักจะแกะค่าตัวเลือก บางคนบอกว่าคุณพูดถูก
Dan Rosenstark

2
Bundle.mainมีความว่างเปล่าinfoDictionaryสำหรับฉัน อาจเป็นเพราะฉันทำจากภายในกรอบไม่ใช่ปฏิบัติการหรือแอป? Bundle(for: MyClass.self)มีค่าที่คาดหวัง
Raphael

7

อย่างรวดเร็วฉันจะทำให้มันเป็นส่วนขยายสำหรับ UIApplication เช่นนี้:

extension UIApplication {

    func applicationVersion() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
    }

    func applicationBuild() -> String {

        return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
    }

    func versionBuild() -> String {

        let version = self.applicationVersion()
        let build = self.applicationBuild()

        return "v\(version)(\(build))"
    }
}

จากนั้นคุณสามารถใช้สิ่งต่อไปนี้เพื่อรับทุกสิ่งที่คุณต้องการ:

let version = UIApplication.sharedApplication.applicationVersion() // 1
let build = UIApplication.sharedApplication.applicationBuild() // 80
let both = UIApplication.sharedApplication.versionBuild() // 1(80)

7

// ส่งคืนหมายเลขเวอร์ชันของแอป

public static var appVersion: String? {
    return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}

// ส่งคืนหมายเลขบิลด์ของแอป

public static var appBuild: String? {
    return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as? String
}

6

Swift 5.0

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

struct AppInfo {

var appName : String {
    return readFromInfoPlist(withKey: "CFBundleName") ?? "(unknown app name)"
}

var version : String {
    return readFromInfoPlist(withKey: "CFBundleShortVersionString") ?? "(unknown app version)"
}

var build : String {
    return readFromInfoPlist(withKey: "CFBundleVersion") ?? "(unknown build number)"
}

var minimumOSVersion : String {
    return readFromInfoPlist(withKey: "MinimumOSVersion") ?? "(unknown minimum OSVersion)"
}

var copyrightNotice : String {
    return readFromInfoPlist(withKey: "NSHumanReadableCopyright") ?? "(unknown copyright notice)"
}

var bundleIdentifier : String {
    return readFromInfoPlist(withKey: "CFBundleIdentifier") ?? "(unknown bundle identifier)"
}

var developer : String { return "my awesome name" }

// lets hold a reference to the Info.plist of the app as Dictionary
private let infoPlistDictionary = Bundle.main.infoDictionary

/// Retrieves and returns associated values (of Type String) from info.Plist of the app.
private func readFromInfoPlist(withKey key: String) -> String? {
    return infoPlistDictionary?[key] as? String
     }
}

คุณสามารถใช้มันดังนี้:

print("The apps name = \(AppInfo.appname)")

เมื่ออยู่ใน Swift จะไม่มีการใช้ค่าศูนย์ IMO คุณควรส่งคืนค่าศูนย์แทนสตริงตัวยึดตำแหน่งที่กำหนดเอง
Luca Angeletti

นั่นคือเหตุผลที่มันเป็นกระดาษห่อหุ้ม: เพื่อรับบางสิ่งบางอย่างกลับมา สถานการณ์ศูนย์ไม่ได้ "ถูกทำลาย" จริงๆมันยังคงมีอยู่ แต่ได้รับการจัดการล่วงหน้าแล้ว มิฉะนั้นคุณจะต้องจัดการสถานการณ์ "ศูนย์" ในที่อื่นในแอปของคุณ
LukeSideWalker

ขอบคุณตา นอกจากนี้คุณวงเล็บปีกกาสุดท้ายอยู่นอกบล็อกรหัส :)
Mark Perkins

2
ชื่อแอปได้เช่นกันCFBundleDisplayName
gondo

2

รหัสนี้ใช้ได้กับ Swift 3, Xcode 8:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let build = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"


1

[อัปเดต: Xcode 6.3.1] ฉันลองทำตามข้างต้นทั้งหมดแล้วและไม่สามารถใช้งานได้ใน Xcode 6.3.1 แต่ฉันพบว่าสิ่งนี้ทำ:

(NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String)!

1

อีกทางเลือกหนึ่งคือการกำหนดใน AppDelegate ตัวแปร:

var applicationVersion:String {
    return NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
}
var applicationBuild:String  {
    return NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) as! String
}
var versionBuild:String  {
    let version = self.applicationVersion
    let build = self.applicationBuild
    return "version:\(version) build:(\(build))"
}

ที่สามารถอ้างอิงเป็นตัวแปรใน AppDelegate



0

SWIFT 3 เวอร์ชัน

if let infoPath = Bundle.main.path(forResource: "Info.plist", ofType: nil),
        let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath),
        let infoDate = infoAttr[.creationDate] as? Date
{
    return infoDate
}
return Date()

0

เพื่อให้ได้ผลลัพธ์สำหรับกรอบคุณสามารถใช้ได้

let version = Bundle(for: type(of: self)).infoDictionary?["CFBundleShortVersionString"] as? String

หรือในการทดสอบ

let version = Bundle(for: <SomeClass>.self).infoDictionary?["CFBundleShortVersionString"] as? String
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.