সুইফট সহ সংস্করণ এবং বিল্ড তথ্য প্রাপ্তি


92

সংস্করণ এবং বিল্ড তথ্য পুনরুদ্ধার করতে আমি মূল এনএসবান্ডলে অ্যাক্সেস পাওয়ার চেষ্টা করছি। কথাটি হ'ল, আমি এটি দ্রুতগতিতে চেষ্টা করতে চাই, আমি জানি কীভাবে এটি উদ্দেশ্য-সি-তে এটি পুনরুদ্ধার করতে Build.text = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];। তবুও আমি জানি না যে দ্রুতটি দিয়ে কোথায় শুরু করতে হবে, আমি এটিকে নতুন সিনট্যাক্সে কোনও লাভ ছাড়াই লেখার চেষ্টা করেছি।


4
আপনি ইতিমধ্যে করা প্রচেষ্টা প্রদর্শন করুন। এটি উদ্দেশ্য-সি বাস্তবায়নের সাথে খুব মিল to
মিক ম্যাককালাম

জানুয়ারী 2017 পরিবর্তন 2.3: এসভিার = এনএসবান্ডেল.মাইনবান্ডেল ()। তথ্য অভিধান? ["CFBundleShortVersionString"] হিসাবে? স্ট্রিংয়ে এসবিল্ড = এনএসবান্ডেল.মাইনবান্ডেল ()। তথ্যডোরিয়াল? ["CFBundleVersion"] হিসাবে? স্ট্রিং self.myVersionLabel.text = স্ট্রিং (ফর্ম্যাট: "সংস্করণ% @ বিল্ড% @", এসওয়ার !, এস বিল্ড!)
ম্যাথু ফার্গুসন

উত্তর:


167

সুইফট সিনট্যাক্সে কী ভুল ছিল? এটি কাজ করে বলে মনে হচ্ছে:

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

4
কেন এই নিম্নমানের ছিল? আমি অনুমান করি এটি সম্ভবত আরও প্রাকৃতিক হতে পারে letতবে অন্যথায় এটি সঠিক দেখাচ্ছে।
টমি

আহ, আমি "স্ট্রিং হিসাবে" ভুলে গিয়েছিলাম তাই ভেরিয়েবল এটিকে স্ট্রিং হিসাবে গ্রহণ করবে। ধন্যবাদ.
কেন-উবিডেক্স

4
এটি XCode 6 বিটা 3 দিয়ে ভাঙ্গা বলে মনে হচ্ছে
ফ্রিডেরিক অ্যাডা

4
এটি আমার জন্য এক্সকোড 6 বিটা 5 এ কাজ করেছে:let text = NSBundle.mainBundle().infoDictionary["CFBundleVersion"]! as String
ই বার্নস

@ ডিয়ান দেখে মনে হচ্ছে তারা কোনও alচ্ছিক ফিরিয়ে দিতে তথ্য অভিধানে পরিবর্তন করেছে। আমি উত্তরটি সম্পাদনা করেছি
কনার

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

যেমন এখানে দেখা ।


4
আপনি একই কী দু'বার পেয়েছেন, সংস্করণটির জন্য "সিএফবান্ডেল ভার্সন" ব্যবহার করা উচিত। আমি অনুমান এটা একটি কপি / অতীত টাইপো হয় :)
foOg

ধন্যবাদ @ ফগো এটি একটি টাইপ ছিল। আসলে এটি পিছনের দিকে: সংক্ষিপ্তটি হ'ল সংস্করণ, নিয়মিতটি হ'ল বিল্ড। অদ্ভুত, আমি জানি।
ড্যান রোজনস্টার্ক

সুইফট 3 সংস্করণ। যদি infoPath = Bundle.main.path (forResource: "Info.plist", ofype: nil), তাহলে তথ্যআউট = চেষ্টা করতে দিন? ফাইলম্যানেজ.ডেফল্ট.অ্যাট্রিবিউটস অফফিট (এটপ্যাথ: ইনপথপ্যাথ), ইনফরম্যাটেট = ইনফরমেশন [.ক্রিয়েশনডেট] হিসাবে? তারিখ {ফেরত তথ্য তারিখ} ফেরতের তারিখ ()
রায়ান এক্স

18

এক্সকোড 6 ব্যবহারের চূড়ান্ত মুক্তির জন্য

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

দ্য "?" তথ্য অভিধানের পরে চরিত্রটি এখানে গুরুত্বপূর্ণ


4
জঘন্য। আমি নিশ্চিত যে এই পুরো "প্রেমিক, আনপ্রেপ!" ভালবাসেন না! সিস্টেম, এটি স্ফটিক পরিষ্কার এবং এত সহজে পড়া যায়!
জেরোইন বোমা

14

বিল্ড এবং সংস্করণ পাওয়ার সহজ উপায় এখানে।

সুইফট 4. এক্স এর জন্য

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

আপনার মানগুলি কেন খালি করা দরকার? আমার জ্ঞান অনুসারে, এই মানগুলির
মাইকেল

@ মিশেল কিছু লোক ALচ্ছিক মানগুলি সর্বদা মোড়ক করুন। কিছু লোক বলেছেন যে আপনি ঠিক বলেছেন।
ড্যান রোজনস্টার্ক

4
Bundle.maininfoDictionaryআমার জন্য একটি খালি ছিল ; সম্ভবত কারণ আমি এটি একটি কাঠামোর মধ্যে থেকে করছি, একটি এক্সিকিউটেবল বা অ্যাপ্লিকেশন নয়? Bundle(for: MyClass.self)প্রত্যাশিত মান রয়েছে।
রাফেল

7

দ্রুত পদক্ষেপে, আমি এটির মতো ইউআইএ অ্যাপ্লিকেশনটির জন্য এটি এক্সটেনশন হিসাবে তৈরি করব:

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 একটি লেফাফা নির্মিত অ্যাপ্লিকেশন এর সাথে সম্পর্কিত স্ট্রিং আমার সব অ্যাপ্লিকেশান এক জায়গায় বলা এ 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)")

যখন সুইফটে কোনও মান পাওয়া যায় না শূন্য ব্যবহৃত হয়। IMO আপনার কাস্টম স্থানধারক স্ট্রিংয়ের পরিবর্তে শূন্য করা উচিত।
লুকা অ্যাঞ্জলেট্টি

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

ধন্যবাদ কুঁড়ি এছাড়াও, আপনি সর্বশেষ কোঁকড়ানো ধনুর্বন্ধনী কোড ব্লকের বাইরে। :)
মার্ক পার্কিনস

4
অ্যাপের নাম এও হতে পারেCFBundleDisplayName
Gondo

2

এই কোডটি সুইফট 3, এক্সকোড 8 এর জন্য কাজ করে:

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

2

সুইফ্ট 3-এর জন্য, এনএসবান্ডেলকে বান্ডিলের সাথে প্রতিস্থাপন করুন এবং মেইনবান্ডেল কেবল প্রধান দ্বারা প্রতিস্থাপন করা হবে।

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

1

[আপডেট: এক্সকোড .3.৩.১] আমি উপরের সমস্তগুলি চেষ্টা করে দেখেছি এবং এক্সকোড .3.৩.১ এ এর ​​কোনওটিই কাজ করে নি তবে আমি দেখতে পেয়েছি যে এটি করে:

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

1

আরেকটি বিকল্পটি অ্যাপ্লিকেশনগুলিতে ভেরিয়েবলগুলি সংজ্ঞায়িত করা হয়:

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

এটিকে অ্যাপডিলেজেটে ভেরিয়েবল হিসাবে উল্লেখ করা যেতে পারে



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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.