स्विफ्ट के साथ संस्करण और बिल्ड जानकारी प्राप्त करना


92

मैं संस्करण और बिल्ड जानकारी प्राप्त करने के लिए मुख्य NSBundle तक पहुंच प्राप्त करने का प्रयास कर रहा हूं। बात यह है, मैं इसे तेजी से आज़माना चाहता हूं, मुझे पता है कि इसे ऑब्जेक्टिव-सी में कैसे प्राप्त किया जाए Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];। फिर भी मुझे नहीं पता कि स्विफ्ट के साथ कहां से शुरुआत करनी है, मैंने बिना किसी लाभ के इसे नए सिंटैक्स में लिखने का प्रयास किया है।


2
आपके द्वारा पहले से किए गए प्रयासों को दिखाएं। यह उद्देश्य-सी कार्यान्वयन के समान है।
मिक मैकलम

जनवरी 2017 स्विफ्ट 2.3: sVer = NSBundle.mainBundle ()। Info ढोंग? ["CFBundleShortVersionString"] के रूप में दें? स्ट्रिंग करते हैं sBuild = NSBundle.mainBundle ()। जानकारी। [? "CFBundleVersion"] के रूप में? स्ट्रिंग self.myVersionLabel.text = स्ट्रिंग (प्रारूप: "संस्करण% @ बिल्ड% @", sVer !, sBuild!)
मैथ्यू फर्ग्यूसन

जवाबों:


167

स्विफ्ट सिंटैक्स में क्या गलत था? यह काम करने लगता है:

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

2
इसे क्यों ठुकरा दिया गया? मुझे लगता है कि यह अधिक प्राकृतिक हो सकता है letलेकिन यह अन्यथा सही लगता है।
टॉमी

आह, मैं "स्ट्रिंग के रूप में" भूल गया, इसलिए चर इसे एक स्ट्रिंग के रूप में स्वीकार करेगा। धन्यवाद।
केन-यूबीडीएक्स

2
कि XCode 6 बीटा 3 के साथ टूट गया लगता है
Frédéric Adda

2
यह मेरे लिए Xcode 6 बीटा 5 में काम किया:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
ई। बार्न्स

@ डीन ऐसा लगता है कि उन्होंने वैकल्पिक वापस करने के लिए इन्फोर्मेशन बदल दी है। मैंने उत्तर संपादित किया है
कॉनर

118

स्विफ्ट 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)"
} 

स्विफ्ट 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 यह एक टाइपो था। वास्तव में यह पीछे की ओर है: लघु एक संस्करण है, नियमित एक बिल्ड है। अजीब है, मुझे पता है।
दान Rosenstark

स्विफ्ट 3 संस्करण। यदि InfoPath = bund.main.path (forResource: "Info.plist", ofType: nil) करते हैं, तो जानकारी दें = कोशिश करें? FileManager.default.attributesOfItem (atPath: infoPath), infoDate = infoAttr [.creationDate] को बताएं? दिनांक {वापसी की जानकारी दें} वापसी दिनांक ()
रयान एक्स

18

Xcode 6 उपयोग के अंतिम रिलीज के लिए

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

"?" जानकारी के बाद चरित्र यहाँ महत्वपूर्ण है


1
अरे नहीं। मुझे यकीन है कि यह पूरी तरह से "वैकल्पिक ?, खोलना प्यार करता हूँ!" प्रणाली, यह क्रिस्टल स्पष्ट है और पढ़ने में इतना आसान है!
जीरो बुमा

14

यहाँ बिल्ड और संस्करण प्राप्त करने का सरल तरीका है।

स्विफ्ट 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

इस तरह से 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 कुछ लोग हमेशा वैकल्पिक मानों को खोलते हैं। कुछ लोग कहते हैं कि आप सही हैं।
दान रोसेनस्टार्क

2
Bundle.maininfoDictionaryमेरे लिए एक खाली था ; हो सकता है क्योंकि मैं इसे एक ढांचे के भीतर से कर रहा हूं, एक निष्पादन योग्य या ऐप नहीं? Bundle(for: MyClass.self)इसमें अपेक्षित मूल्य समाहित हैं।
राफेल

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

स्विफ्ट 5.0

मैंने अपने सभी ऐप में एक स्थान पर कुछ ऐप से संबंधित तार पाने के लिए स्विफ्ट 5 के लिए एक रैपर बनाया , जिसे ऐपइन्फो कहा जाता है ।

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)")

जब स्विफ्ट में कोई मूल्य उपलब्ध नहीं होता है तो निल का उपयोग किया जाता है। IMO आपको कस्टम प्लेसहोल्डर स्ट्रिंग्स के बजाय नील को वापस करना चाहिए।
लुका अनगेलेट्टी

Thats क्यों यह एक आवरण है: हमेशा कुछ वापस पाने के लिए। नील-स्थिति वास्तव में "नष्ट" नहीं है, यह अभी भी है, लेकिन पहले से ही संभाला हुआ है। अन्यथा आपको अपने ऐप में किसी अन्य स्थान पर "nil" -situation को संभालना होगा।
ल्यूकसाइडवल्कर

धन्यवाद दोस्त। इसके अलावा, आप पिछले कर्ली ब्रेस कोड ब्लॉक के बाहर हैं। :)
मार्क पर्किन्स

2
ऐप का नाम यह भी हो सकता हैCFBundleDisplayName
गोंडो

2

यह कोड स्विफ्ट 3, Xcode 8 के लिए काम करता है:

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

2

स्विफ्ट 3 के लिए, NSBundle को बंडल से बदलें और mainBundle को केवल मुख्य द्वारा प्रतिस्थापित किया जाता है।

let AppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String

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

स्विफ्ट 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.