আমি কীভাবে অ্যাপ্লিকেশন সংস্করণটি পাব এবং সুইফ্ট ব্যবহার করে নম্বর তৈরি করব?


386

আমার কাছে একটি আইওএস অ্যাপ রয়েছে একটি অ্যাজুরে ব্যাক-এন্ড রয়েছে এবং লগইন এবং অ্যাপ্লিকেশন ব্যবহারকারীদের কোন সংস্করণ চলছে তার মতো নির্দিষ্ট ইভেন্টগুলিতে লগ করতে চাই।

আমি কীভাবে সংস্করণটি ফিরিয়ে আনব এবং সুইফ্ট ব্যবহার করে নম্বর তৈরি করব?



6
এটি উদ্দেশ্য-সি, সুইফট নয়।
vyvind Vik

10
বিভ্রান্ত না করার বিষয়ে নিশ্চিত হন CFBundleVersionএবং সিএফবান্ডেলশার্টভিশন স্ট্রিং` ` প্রথমটি আপনার বিল্ড সংস্করণ। অন্যটি সংস্করণ নম্বর। আরও তথ্যের জন্য এখানে দেখুন
মধু

1
@ আইভিন্দভিক বেশিরভাগ লোক ধরে ধরেছেন যে আপনি হাত না ধরেই সুইফটে একটি উদ্দেশ্য-সি সমাধান অনুবাদ করতে পারেন।
gnasher729

উত্তর:


424

সম্পাদনা

সুইফট ৪.২ এর জন্য আপডেট হয়েছে

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String

সম্পাদনা

এক্সকোডের নতুন সংস্করণে @azdev দ্বারা নির্দেশিত হিসাবে আপনি আমার আগের সমাধানটি চেষ্টা করার জন্য একটি সংকলন ত্রুটি পাবেন, এটি সমাধান করতে কেবল এটি ব্যবহার করে বান্ডিল অভিধানটি মোড়ক করার পরামর্শ হিসাবে এটি সম্পাদনা করুন!

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

আমি মনে করি এটা আপনার কাজে লাগবে.

ডেভিড


যখন আমি এটি ব্যবহার করি, আমি একটি সংকলক ত্রুটি পেয়েছি "[এনএসওজেক্ট: আনিওজেক্ট]? 'সাবস্ক্রিপ্ট'" নামে একটি সদস্য নেই
Andreas

আপনি যেকোনওজেক্ট প্রতিস্থাপনের চেষ্টা করতে পারেন? যেকোনওবজেক্ট দ্বারা! আপনি যে কোডটি ব্যবহার করছেন ঠিক তা না জেনে ভুলটি অনুমান করা খুব কঠিন, এছাড়াও মনে রাখবেন যে সুইফ্ট একটি এক্সকোড রিলিজ থেকে অন্যটিতে পরিবর্তন করতে পারে, তাই আপনার কোডটি Xcode জানার ক্ষেত্রেও প্রাসঙ্গিক হবে।
ডেভিড

18
@ Andreas infoDictionaryব্যবহার করে মোড়ানো উচিত !। এটিই আমি ব্যবহার করছি, একটি গ্লোবালস.সুইফ্ট ফাইলে রেখেছি:let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
আজদেব

1
আমাকে আরও একটি যোগ করতে হয়েছিল "!" "হিসাবে" পরে। let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
ইয়োসেই

3
আপনার "জোর করে আন-র্যাপ ব্যবহার করা উচিত নয়!"
জুলিয়াস

278

আমি জানি এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে তবে ব্যক্তিগতভাবে আমি মনে করি এটি একটু পরিষ্কার er

সুইফট 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
}

এইভাবে, যদি চলুন সংস্করণটি শর্তসাপেক্ষ প্রক্রিয়াজাতকরণ (আমার ক্ষেত্রে লেবেল পাঠ্য সেট করে) এবং যদি তথ্য অভিধানে বা সিএফবান্ডেলশার্টভিশন স্ট্রিং শূন্য থাকে তবে কোডটি বাদ দেওয়া হবে।


6
self.labelVersion.textNSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
ptionচ্ছিক

8
মান নির্ধারণ না করার কোন কারণ আছে? সম্মত হয়েছে যে এটি অবশ্যই আরও সতর্ক let, কেবল কেন এটি প্রয়োজন হতে পারে তা ভেবে অবাক হলেন । ধন্যবাদ!
ক্র্যাশলোট

@ আপনার নাম সত্ত্বেও ক্র্যাশলোট;) আপনি চান না যে আপনি যদি অ্যাপটি টাইপ করে ফেলেন, তবে সংস্করণ নম্বরটি "কিছু ভুল হয়ে গেছে" হোক।
ড্যানিয়েল স্প্রিংগার

ওপি: আপনি কি প্রতিস্থাপন করতে পারেন? সঙ্গে ! এবং "স্ট্রিং হিসাবে" সরান। যদি এটি শূন্য হয় তবে তা কোনওভাবেই ক্রাশ হবে না
ড্যানিয়েল স্প্রিংগার

245

সুইফট 3.0 এর জন্য আপডেট করা হয়েছে Updated

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
    }

}

এখন এই এক্সটেনশনটি মূল বান্ডেল এবং অন্য যে কোনও অন্তর্ভুক্ত বান্ডিল (যেমন এক্সটেনশন প্রোগ্রামিংয়ের জন্য একটি ভাগ করা কাঠামো বা তৃতীয় ফ্রেমওয়ার্ক যেমন এএফ নেট নেটওয়ার্কিং) উভয় সনাক্ত করতে অ্যাপগুলিতে কার্যকর হবে:

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

সিএফবান্ডেল ভার্সনকি এখন আর সুইফট 3, এক্সকোডে কাজ করে না you আপনি কী নতুন কী ব্যবহার করবেন তা জানেন?
ক্রশলোট

71

আমি এটিও জানি যে এরই মধ্যে উত্তর দেওয়া হয়েছে তবে আমি পূর্ববর্তী উত্তরগুলি গুটিয়ে রেখেছি:

(*) এক্সটেনশনের জন্য আপডেট হয়েছে

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

@ অবজ্ঞাত: পুরানো উত্তর

সুইফট ৩.১ :

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

1
বা: ক্লাস ফানক getVersion () -> স্ট্রিং {NSBundle.mainBundle () ফেরান info স্ট্রিং ?? "কোনও সংস্করণের তথ্য নেই"}
টেপমোনকি

আমি মনে করি অন্যান্য উত্তরগুলি অনুলিপি করার কোনও অর্থ নেই। যদি আপনার উত্তরটি আর বৈধ না হয় তবে আপনার সর্বদা এটি মুছে ফেলা এবং অন্যান্য উত্তরের জন্য জায়গা তৈরির সম্ভাবনা রয়েছে :)
carmen_munich

1
@ কারম্যান_মিনিচ আপনি যেহেতু এখানে নিন্দা করছেন তা আমাকে উত্তর দিতে হবে। প্রথমত, এই উত্তরটি মার্চ 2015 পোস্ট করা হয়েছে এবং আপনার উত্তর ফেব্রুয়ারী 2017 পোস্ট করা হয়েছে Therefore সুতরাং, আপনার অনুপ্রেরণা অবশ্যই পূর্ববর্তী উত্তরগুলি থেকে আসতে হবে। দ্বিতীয়ত, আমি আপনার উত্তরটি মোটেও দেখিনি, আমি আমার উত্তরটি আপডেট করেছি কারণ আমি আজকাল এইভাবে এটি ব্যবহার করি। আমি অনুমান করি iOS সম্প্রদায়ের কারও কাছে এক্সটেনশন ব্যবহার অনন্য নয়। সত্যই, দয়া করে পরিণত হওয়ার চেষ্টা করুন এবং অন্যান্য বিকাশকারীদের সম্মান করুন। আমি এখানে কিছু পোস্ট করতে পারি না। আমি মানুষকে এটিই সহায়তা করতে চাই। এসও তে সহায়তা করার চেষ্টা করা লোককে নিরুৎসাহিত না করার চেষ্টা করুন।
গুণহান

আমি নবাবিদের কাছ থেকে প্রচুর প্রতিক্রিয়া শুনেছি যে তারা একটি উত্তর পোস্ট করেছে এবং দেখতে চায় যে কেউ "আপ" ক্লিক করে যা মানুষকে দেখতে সত্যিই দুর্দান্ত এবং উত্সাহিত করে। তবে কেউ যদি তার পুরানো উত্তরে উত্তরগুলি অনুলিপি করেন তবে যিনি পোস্ট করার চেষ্টা করেছেন তিনি যে অনুপ্রেরণা পাবেন না যে কেউ এটিকে ভোট দিয়েছিল। সুতরাং নবজাতকরা সত্যই হতাশাবোধ বোধ করছে এবং তারা অনুভব করছে যে তারা সম্প্রদায়ের কাছে কোন মূল্য আনবে না এবং পোস্ট করা বন্ধ করে দেয়। এবং এটি ভুল পাবেন না, আমি সাধারণভাবে এটি বোঝাতে চাই। আশা করি আপনি বিরক্ত বোধ করবেন না এবং এখনই আরও ভাল করে বুঝতে পারবেন কেন আমি এই পরামর্শটি দিয়েছি।
carmen_munich

@ কারমেন_মুনিচ আপনি যদি কালানুক্রমিকভাবে এই প্রশ্নের উত্তরগুলি অর্ডার করেন তবে আপনি খেয়াল করবেন যে ইতিমধ্যে অন্য কেউ আপনার আগে যেমন উত্তর দিয়েছিল তেমন উত্তর দিয়েছে! সুতরাং আপনি আমাকে দোষ দিচ্ছেন যা আপনি নিজেই করেছিলেন। যেহেতু আমি এই প্রশ্নের ইতিহাস রেখেছি, তাই আমি আমার আপডেট ব্যবহারের নতুন পছন্দগুলি একটি আপডেটে ভাগ করেছি। এখানেই শেষ.
গুণহান


28

আমি বান্ডলে একটি এক্সটেনশন করেছি

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

আসলে এর বিট ভিন্ন। উদাহরণস্বরূপ আমি জোর মোড়ক ব্যবহার করি। আপনি হয়ত ভাবেন যে জোর করে আন-র্যাপিং করা সাধারণভাবে খারাপ, এটি বিরল ক্ষেত্রে এটি যেখানে এটি ঠিক। আরও কিছুটা ব্যাখ্যা করার জন্য, এই মানগুলি অভিধানে থাকা উচিত অন্যথায় প্রকল্প ফাইলের সাথে সত্যিই কিছু ভুল। এই কারণেই এই পন্থাটি জোর করে
মোড়ক

পুনরায় নামকরণ এবং জোর করে মোড়ক দেওয়া নতুন উত্তর হিসাবে পোস্ট করার কোনও পরিবর্তন নয়। এছাড়াও, লোকেরা যখন আপনার উত্তর দেখবে তখন জোর করে আন-র্যাপিং শিখতে পারে। পাঠকদের কাছে, কী কী আছে তা ধরে নিবেন না, জোর করে মোড়ক মোড়ানো না করে optionচ্ছিক আন-র্যাপিং ম্যানুয়ালি হ্যান্ডেল করা ভাল।
গুণহান

ন্যায়বিচারের জন্য এখানে কিছু বিরল কেস রয়েছে যেখানে জোর করে মোড়ক দেওয়া ঠিক আছে। এই একটি পোস্টে কেবল একটি কেস দেখানো হয়েছে যেখানে এটি ঠিক থাকতে পারে। পল হডসনের কিছু ভাল ব্যাখ্যা এবং টিউটোরিয়াল রয়েছে তবে আন-র্যাপিং মামলাগুলি সম্পর্কে আপনি যদি আরও জানতে চান। আমি সত্যিই সমস্ত newbies www.hackingwithswift.com
carmen_munich

এটি newbies জন্য একটি ভাল সুপারিশ। আপনি আরও পড়তে পারেন এবং আরও শিখতে পারেন। এছাড়াও আপনার মন্তব্য এবং সেগুলি বোঝায় সে সম্পর্কে আপনার বোঝার উন্নতি করা উচিত। উদাহরণস্বরূপ কেউ আপনাকে কখনই বলেনি / সর্বদা আন-র্যাপিং বল প্রয়োগ করবেন না। তবে তথ্য ডিকের জন্য সেই কীগুলি সরিয়ে ফেলা যেতে পারে এবং জোর করে আনওয়ারপিংয়ের ফলে ক্র্যাশ হতে পারে। এখানে মোড়ক খাওয়ানো পরিচালনা করা নিরাপদ।
গুণহান

তারা ব্যাখ্যা করতে পারেন যে কোন ক্ষেত্রে তারা অপসারণ করতে এবং শূন্য হতে পারে? আমি উত্স থেকে যা শিখেছি উল্লেখ করেছেন যে এটি এই পার্টিউক্লেয়ারের ক্ষেত্রে নয়। প্রকল্প ফাইলটি ভাঙা না থাকলে তাদের সর্বদা উপস্থিত থাকতে হবে, সেক্ষেত্রে প্রকল্পটি সম্ভবত কোনওভাবেই সংকলন করবে না
carmen_munich

16

সুইফট ৩.০ এর জন্য এনএসবান্ডেল কাজ করে না, নিম্নলিখিত কোডটি পুরোপুরি কার্যকর হয়।

let versionNumberString =
      Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
          as! String

এবং কেবল বিল্ড নম্বরটির জন্য এটি হ'ল:

let buildNumberString =
      Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
          as! String

বিভ্রান্তিমূলকভাবে 'সিএফবান্ডেল ভার্সন' হ'ল জেনারেল>> পরিচয়ের জন্য এক্সকোডে প্রবেশ করা বিল্ড নম্বর।


15

এক্সকোড 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
    }
}

14

এক্সকোড 8, সুইফট 3:

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

12

সুইফড 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))"
    }
}

এটি ব্যবহার করার জন্য আপনাকে Bundle.main.full ভার্সন বলতে হবে উদাহরণস্বরূপ
জোসেফ আস্ট্রাহান

11

বান্ডেল + + 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

11

ওপি উভয় সংস্করণ নম্বর এবং বিল্ড নম্বর চেয়েছিল। দুর্ভাগ্যক্রমে বেশিরভাগ উত্তর সেই দুটি বিকল্পই সরবরাহ করে না। অতিরিক্তভাবে, অন্যরা অপ্রয়োজনীয় এক্সটেনশন পদ্ধতি যুক্ত করে। এটি বেশ সহজ এবং অপের সমস্যার সমাধান করে:

// 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 ""
  }
}


8

আমি ইউআইএ অ্যাপ্লিকেশনটির জন্য একটি এক্সটেনশন তৈরি করেছি।

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

6

ডকুমেন্টেশনটি দেখে, আমি বিশ্বাস করি যে নিম্নলিখিতটি আরও পরিষ্কার:

let version = 
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") 
as? String

উত্স : "এই অ্যাক্সেসের ব্যবহার অন্যান্য অ্যাক্সেস পদ্ধতির তুলনায় বেশি পছন্দ করা হয় কারণ এটি যখন উপলব্ধ থাকে তখন কোনও কীটির স্থানীয়ীকৃত মান প্রদান করে।"


1
সঠিক সুইফট পথে
ঠাঁই দেয়


4

সুইফট 3:

সংস্করণ সংখ্যা

if let versionNumberString = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String { // do something }

বিল্ড নম্বর

if let buildNumberString = Bundle.main.infoDictionary?["CFBundleVersion"] as? String { // do something }

কিভাবে বিল্ড নম্বর সম্পর্কে? ধন্যবাদ! CFBundleVersionKey কাজ করে না।
ক্র্যাশলোট

@ ক্র্যাশলোট আমি বিল্ড নম্বরটি দিয়ে এটি আপডেট করেছি। এখানে সমস্ত কোর ফাউন্ডেশন কীগুলির একটি তালিকা রয়েছে: বিকাশকারী
অ্যাপ্লিকেশন

3

সুইফট 4

func getAppVersion() -> String {
    return "\(Bundle.main.infoDictionary!["CFBundleShortVersionString"] ?? "")"
}

Bundle.main.infoDictionary! [ "CFBundleShortVersionString"]

পুরানো বাক্য গঠন দ্রুতগতিতে

let appVer: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]

2
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
    }

}

দৃষ্টি আকর্ষণ: আপনার যদি অ্যাপ্লিকেশন সংস্করণ বা বিল্ড সেট না করা থাকে তবে যদি আপনি ব্যবহার করার চেষ্টা করেন তবে ক্র্যাশ হওয়ার কারণ হতে পারে আপনার যদি এখানে ব্যবহার করা উচিত! আবদ্ধ করা।


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

2

আগের মতো স্ট্রোলি টাইপড কোড ব্যবহার না করে আপনি এখন এ জন্য একটি ধ্রুবক ব্যবহার করতে পারেন যা জিনিসগুলিকে আরও সুবিধাজনক করে তুলেছে।

var appVersion: String {
    return Bundle.main.infoDictionary![kCFBundleVersionKey as String] as! String
}


1

সুইফট 4

// প্রথমে sচ্ছিক যিনিওবজেক্ট হিসাবে সংজ্ঞা দিয়ে এনএসবজেক্টটি পান

let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject

// তারপরে অবজেক্টটিকে কেবল স্ট্রিং হিসাবে কাস্ট করুন তবে সাবধান থাকুন, আপনি নিলে ডাবল চেক করতে চাইতে পারেন

let version = nsObject as! String

1

অ্যাপ্লিকেশন সংস্করণটি ইন্ট হিসাবে ফেরত দেওয়ার জন্য সহজ ইউটিলিটি ফাংশন

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
    }


0

আগ্রহী যে কেউ জন্য, একটি সুন্দর এবং ঝরঝরে গ্রন্থাগার নামক SwifterSwiftএ উপলব্ধ GitHub এবং সম্পূর্ণরূপে দ্রুতগতি প্রতিটি সংস্করণের জন্য নথিভুক্ত (দেখুন swifterswift.com )।

এই লাইব্রেরিটি ব্যবহার, অ্যাপ্লিকেশন সংস্করণ পড়া এবং বিল্ড নম্বরটি এর মতো সহজ হবে:

import SwifterSwift

let buildNumber = SwifterSwift.appBuild
let version = SwifterSwift.appVersion


0

সুইফট 5 এর জন্য আপডেট

এখানে একটি অ্যাপ্লিকেশন ব্যবহার করছি যা "অ্যাপ্লিকেশন আপডেট হওয়া" পৃষ্ঠাটি প্রদর্শিত হবে কিনা তা সিদ্ধান্ত নিতে আমি ব্যবহার করছি। এটি বিল্ড নম্বরটি প্রদান করে, যা আমি একটি ইন্টারে রূপান্তর করছি:

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 ফেরত আসবে যা বর্তমান বিল্ড সংখ্যার চেয়ে কম। এই জাতীয় স্ক্রিনটি নতুন ব্যবহারকারীদের কাছে না দেখানোর জন্য, প্রথম লগইনের পরে বা অন বোর্ডিং সম্পূর্ণ হওয়ার পরে কেবল বিল্ড নম্বর যুক্ত করুন।


0

জন্য সুইফট 5.0 :

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

-1

জন্য সুইফট 2.0

//First get the nsObject by defining as an optional anyObject

let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"]
let version = nsObject as! String
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.