मेरे पास एक एज़्योर बैक-एंड के साथ एक आईओएस ऐप है, और कुछ घटनाओं को लॉग करना पसंद करेंगे, जैसे लॉगइन और ऐप के कौन से संस्करण उपयोगकर्ता चला रहे हैं।
मैं स्विफ्ट का उपयोग करके संस्करण कैसे बना सकता हूं और संख्या का निर्माण कर सकता हूं?
मेरे पास एक एज़्योर बैक-एंड के साथ एक आईओएस ऐप है, और कुछ घटनाओं को लॉग करना पसंद करेंगे, जैसे लॉगइन और ऐप के कौन से संस्करण उपयोगकर्ता चला रहे हैं।
मैं स्विफ्ट का उपयोग करके संस्करण कैसे बना सकता हूं और संख्या का निर्माण कर सकता हूं?
जवाबों:
संपादित करें
स्विफ्ट 4.2 के लिए अपडेट किया गया
let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
संपादित करें
जैसा कि @azdev द्वारा Xcode के नए संस्करण पर बताया गया है कि आपको मेरे पिछले समाधान को आज़माने के लिए एक संकलन त्रुटि मिलेगी, इसे हल करने के लिए इसे संपादित करें जैसा कि बंडल शब्दकोश का उपयोग करने का सुझाव दिया गया है!
let nsObject: AnyObject? = Bundle.main.infoDictionary!["CFBundleShortVersionString"]
अंत संपादित करें
ऑब्जेक्टिव-सी की तुलना में सिर्फ उसी तर्क का उपयोग करें लेकिन कुछ छोटे बदलावों के साथ
//First get the nsObject by defining as an optional anyObject
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary["CFBundleShortVersionString"]
//Then just cast the object as a String, but be careful, you may want to double check for nil
let version = nsObject as! String
मुझे आशा है कि यह आपकी मदद करेगा।
डेविड
infoDictionary
का उपयोग करके अलिखित किया जाना चाहिए !
। यह वही है जो मैं उपयोग कर रहा हूं, एक Globals.swift फ़ाइल में रखा गया है:let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
मुझे पता है कि यह पहले ही जवाब दे दिया गया है, लेकिन मुझे लगता है कि यह थोड़ा साफ है:
स्विफ्ट 3.0:
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
स्विफ्ट <2.3
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
self.labelVersion.text = version
}
इस तरह, अगर लेट वर्जन कंडीशनल प्रोसेसिंग (मेरे मामले में लेबल टेक्स्ट को सेट करना) को ध्यान में रखता है और यदि इन्फर्मेशन या CFBundleShortVersionString एनआईएल है तो वैकल्पिक अल्ट्रापिंग कोड को छोड़ देगा।
self.labelVersion.text
वैकल्पिक प्रकार है, तो आप सीधे असाइन कर सकते हैंNSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
let
, बस सोच रहा था कि इसकी आवश्यकता क्यों हो सकती है। धन्यवाद!
स्विफ्ट 3.0 के लिए अपडेट किया गया
NS
-Prefixes अब स्विफ्ट 3.0 में चले गए हैं और कई गुण / तरीकों नाम बदल गए हैं होने के लिए अधिक Swifty। यहाँ अब ऐसा दिखता है:
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
}
Bundle.main.releaseVersionNumber
Bundle.main.buildVersionNumber
पुराना अद्यतन उत्तर
मैं अपने मूल उत्तर के बाद से फ्रेमवर्क के साथ बहुत काम कर रहा हूं, इसलिए मैं अपने समाधान को कुछ इस तरह से अद्यतन करना चाहता था कि दोनों सरल और बहु-बंडल वातावरण में अधिक उपयोगी हैं:
extension NSBundle { var releaseVersionNumber: String? { return self.infoDictionary?["CFBundleShortVersionString"] as? String } var buildVersionNumber: String? { return self.infoDictionary?["CFBundleVersion"] as? String } }
अब यह एक्सटेंशन मुख्य बंडल और किसी भी अन्य शामिल बंडल (जैसे विस्तार प्रोग्रामिंग के लिए एक साझा ढांचा या AFNetworking जैसे तीसरे ढांचे) दोनों की पहचान करने के लिए ऐप्स में उपयोगी होगा, जैसे:
NSBundle.mainBundle().releaseVersionNumber NSBundle.mainBundle().buildVersionNumber // or... NSBundle(URL: someURL)?.releaseVersionNumber NSBundle(URL: someURL)?.buildVersionNumber
मूल उत्तर
मैं पहले से ही पोस्ट किए गए कुछ उत्तरों में सुधार करना चाहता था। मैंने एक क्लास एक्सटेंशन लिखा, जिसे और अधिक तार्किक तरीके से संभालने के लिए इसे आपके टूल चेन में जोड़ा जा सकता है।
extension NSBundle { class var applicationVersionNumber: String { if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"]
जैसा? स्ट्रिंग {रिटर्न संस्करण} रिटर्न "संस्करण संख्या उपलब्ध नहीं है"}
class var applicationBuildNumber: String { if let build = NSBundle.mainBundle().infoDictionary?["CFBundleVersion"] as? String { return build } return "Build Number Not Available" } }
तो अब आप इसे आसानी से एक्सेस कर सकते हैं:
let versionNumber = NSBundle.applicationVersionNumber
मुझे यह भी पता है कि यह पहले ही उत्तर दिया जा चुका है लेकिन मैंने पिछले उत्तरों को लपेट लिया है:
extension Bundle {
var releaseVersionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildVersionNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
var releaseVersionNumberPretty: String {
return "v\(releaseVersionNumber ?? "1.0.0")"
}
}
उपयोग:
someLabel.text = Bundle.main.releaseVersionNumberPretty
स्विफ्ट 3.1 :
class func getVersion() -> String {
guard let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String else {
return "no version info"
}
return version
}
पुराने संस्करणों के लिए :
class func getVersion() -> String {
if let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String {
return version
}
return "no version info"
}
इसलिए यदि आप लेबल पाठ सेट करना चाहते हैं या कहीं और उपयोग करना चाहते हैं;
self.labelVersion.text = getVersion()
के लिए स्विफ्ट 4.0
let version = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let build = Bundle.main.infoDictionary!["CFBundleVersion"]!
मैंने बंडल पर एक एक्सटेंशन बनाया
extension Bundle {
var appName: String {
return infoDictionary?["CFBundleName"] as! String
}
var bundleId: String {
return bundleIdentifier!
}
var versionNumber: String {
return infoDictionary?["CFBundleShortVersionString"] as! String
}
var buildNumber: String {
return infoDictionary?["CFBundleVersion"] as! String
}
}
और फिर इसका उपयोग करें
versionLabel.text = "\(Bundle.main.appName) v \(Bundle.main.versionNumber) (Build \(Bundle.main.buildNumber))"
स्विफ्ट 3.0 के लिए NSBundle काम नहीं करता है, निम्नलिखित कोड पूरी तरह से काम करता है।
let versionNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
as! String
और सिर्फ बिल्ड नंबर के लिए, यह है:
let buildNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
as! String
भ्रामक रूप से 'CFBundleVersion' बिल्ड नंबर है जैसा कि Xcode में जनरल-> आइडेंटिटी पर दर्ज किया गया है।
Xcode 9.4.1 स्विफ्ट 4.1
बंडल प्रदर्शन नाम का सही भाषा संस्करण लेने के लिए स्थानीयकृतइन्फोएडर के उपयोग पर ध्यान दें।
var displayName: String?
var version: String?
var build: String?
override func viewDidLoad() {
super.viewDidLoad()
// Get display name, version and build
if let displayName = Bundle.main.localizedInfoDictionary?["CFBundleDisplayName"] as? String {
self.displayName = displayName
}
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.version = version
}
if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
self.build = build
}
}
स्विफ्ट 4, बंडल के लिए उपयोगी एक्सटेंशन
import Foundation
public extension Bundle {
public var shortVersion: String {
if let result = infoDictionary?["CFBundleShortVersionString"] as? String {
return result
} else {
assert(false)
return ""
}
}
public var buildVersion: String {
if let result = infoDictionary?["CFBundleVersion"] as? String {
return result
} else {
assert(false)
return ""
}
}
public var fullVersion: String {
return "\(shortVersion)(\(buildVersion))"
}
}
बंडल + Extensions.swift
import Foundation
extension Bundle {
var versionNumber: String? {
return infoDictionary?["CFBundleShortVersionString"] as? String
}
var buildNumber: String? {
return infoDictionary?["CFBundleVersion"] as? String
}
var bundleName: String? {
return infoDictionary?["CFBundleName"] as? String
}
}
उपयोग:
someLabel.text = Bundle.main.versionNumber
ओपी ने वर्जन नंबर और बिल्ड नंबर दोनों के लिए कहा। दुर्भाग्य से अधिकांश उत्तर उन दोनों विकल्पों को प्रदान नहीं करते हैं। इसके अतिरिक्त, अन्य अनावश्यक विस्तार विधियों को जोड़ते हैं। यहाँ एक बहुत आसान है और ओपी की समस्या हल करता है:
// Example output: "1.0 (234)"
private func versionAndBuildNumber() -> String {
let versionNumber = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String
if let versionNumber = versionNumber, let buildNumber = buildNumber {
return "\(versionNumber) (\(buildNumber))"
} else if let versionNumber = versionNumber {
return versionNumber
} else if let buildNumber = buildNumber {
return buildNumber
} else {
return ""
}
}
मेरा उत्तर (अगस्त २०१५ के अनुसार), दी गई स्विफ्ट का विकास जारी है:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
मैंने UIApplication के लिए एक एक्सटेंशन बनाया।
extension UIApplication {
static var appVersion: String {
let versionNumber = Bundle.main.infoDictionary?[IdentifierConstants.InfoPlist.versionNumber] as? String
let buildNumber = Bundle.main.infoDictionary?[IdentifierConstants.InfoPlist.buildNumber] as? String
let formattedBuildNumber = buildNumber.map {
return "(\($0))"
}
return [versionNumber,formattedBuildNumber].compactMap { $0 }.joined(separator: " ")
}
}
struct IdentifierConstants {
struct InfoPlist {
static let versionNumber = "CFBundleShortVersionString"
static let buildNumber = "CFBundleVersion"
}
}
प्रलेखन को देखने के बाद, मेरा मानना है कि निम्नलिखित क्लीनर है:
let version =
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")
as? String
स्रोत : "इस पद्धति का उपयोग अन्य पहुंच विधियों पर पसंद किया जाता है क्योंकि यह एक उपलब्ध होने पर एक कुंजी का स्थानीयकृत मान लौटाता है।"
स्विफ्ट 1.2 के लिए यह है:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
let build = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
स्विफ्ट 3:
संस्करण संख्या
if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }
निर्माण संख्या
if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }
स्विफ्ट 4
func getAppVersion() -> String {
return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}
Bundle.main.infoDictionary! [ "CFBundleShortVersionString"]
पुरानी वाक्य रचना को स्विफ्ट करें
let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
extension UIApplication {
static var appVersion: String {
if let appVersion = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
return "\(appVersion)"
} else {
return ""
}
}
static var build: String {
if let buildVersion = NSBundle.mainBundle().objectForInfoDictionaryKey(kCFBundleVersionKey as String) {
return "\(buildVersion)"
} else {
return ""
}
}
static var versionBuild: String {
let version = UIApplication.appVersion
let build = UIApplication.build
var versionAndBuild = "v\(version)"
if version != build {
versionAndBuild = "v\(version)(\(build))"
}
return versionAndBuild
}
}
ध्यान दें: यदि आपको यहां उपयोग करने की कोशिश करने पर ऐप संस्करण या बिल्ड सेट नहीं है, तो क्रैश हो जाएगा, जिससे दुर्घटना हो सकती है! खोलना।
यहाँ स्विफ्ट 3.2 के लिए एक अद्यतन संस्करण है:
extension UIApplication
{
static var appVersion:String
{
if let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
{
return "\(appVersion)"
}
return ""
}
static var buildNumber:String
{
if let buildNum = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String)
{
return "\(buildNum)"
}
return ""
}
static var versionString:String
{
return "\(appVersion).\(buildNumber)"
}
}
public var appVersionNumberString: String {
get {
return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
}
}
स्विफ्ट 4
// पहले एक वैकल्पिक AnyObject के रूप में परिभाषित करके nsObject प्राप्त करें
let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
// तब केवल ऑब्जेक्ट को एक स्ट्रिंग के रूप में कास्ट करें, लेकिन सावधान रहें, आप शून्य के लिए दोहरी जांच कर सकते हैं
let version = nsObject as! String
Int के रूप में ऐप संस्करण को वापस करने के लिए सरल उपयोगिता फ़ंक्शन
func getAppVersion() -> Int {
if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
let appVersionClean = appVersion.replacingOccurrences(of: ".", with: "", options: NSString.CompareOptions.literal, range:nil)
if let appVersionNum = Int(appVersionClean) {
return appVersionNum
}
}
return 0
}
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
self.lblAppVersionValue.text = version
}
रुचि रखने वाले किसी भी व्यक्ति के लिए, एक अच्छी और साफ-सुथरी लाइब्रेरी है, जिसे गिथूब कहा जाता SwifterSwift
है और यह भी पूरी तरह से तेज के हर संस्करण के लिए दस्तावेज (देखें swifterswift.com )।
इस लाइब्रेरी का उपयोग करना, ऐप वर्जन पढ़ना और नंबर बनाना उतना ही आसान होगा:
import SwifterSwift
let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
lblVersion.text = "Version \(version)"
}
यहाँ एक फ़ंक्शन है जो यह तय करने के लिए उपयोग कर रहा हूं कि "ऐप अपडेटेड" पृष्ठ दिखाना है या नहीं। यह बिल्ड नंबर देता है, जिसे मैं इंट में परिवर्तित कर रहा हूं:
if let version: String = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
guard let intVersion = Int(version) else { return }
if UserDefaults.standard.integer(forKey: "lastVersion") < intVersion {
print("need to show popup")
} else {
print("Don't need to show popup")
}
UserDefaults.standard.set(intVersion, forKey: "lastVersion")
}
यदि इसका उपयोग कभी नहीं किया जाता है तो यह 0 पर वापस आ जाएगा जो वर्तमान बिल्ड संख्या से कम है। नए उपयोगकर्ताओं को ऐसी स्क्रीन नहीं दिखाने के लिए, बस पहले लॉगिन के बाद या ऑन-बोर्डिंग पूरी होने पर बिल्ड नंबर जोड़ें।