আমার কাছে একটি আইওএস অ্যাপ রয়েছে একটি অ্যাজুরে ব্যাক-এন্ড রয়েছে এবং লগইন এবং অ্যাপ্লিকেশন ব্যবহারকারীদের কোন সংস্করণ চলছে তার মতো নির্দিষ্ট ইভেন্টগুলিতে লগ করতে চাই।
আমি কীভাবে সংস্করণটি ফিরিয়ে আনব এবং সুইফ্ট ব্যবহার করে নম্বর তৈরি করব?
আমার কাছে একটি আইওএস অ্যাপ রয়েছে একটি অ্যাজুরে ব্যাক-এন্ড রয়েছে এবং লগইন এবং অ্যাপ্লিকেশন ব্যবহারকারীদের কোন সংস্করণ চলছে তার মতো নির্দিষ্ট ইভেন্টগুলিতে লগ করতে চাই।
আমি কীভাবে সংস্করণটি ফিরিয়ে আনব এবং সুইফ্ট ব্যবহার করে নম্বর তৈরি করব?
উত্তর:
সম্পাদনা
সুইফট ৪.২ এর জন্য আপডেট হয়েছে
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
আমি মনে করি এটা আপনার কাজে লাগবে.
ডেভিড
infoDictionary
ব্যবহার করে মোড়ানো উচিত !
। এটিই আমি ব্যবহার করছি, একটি গ্লোবালস.সুইফ্ট ফাইলে রেখেছি:let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as String
let appVersion = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
আমি জানি এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে তবে ব্যক্তিগতভাবে আমি মনে করি এটি একটু পরিষ্কার 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
}
এইভাবে, যদি চলুন সংস্করণটি শর্তসাপেক্ষ প্রক্রিয়াজাতকরণ (আমার ক্ষেত্রে লেবেল পাঠ্য সেট করে) এবং যদি তথ্য অভিধানে বা সিএফবান্ডেলশার্টভিশন স্ট্রিং শূন্য থাকে তবে কোডটি বাদ দেওয়া হবে।
self.labelVersion.text
NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String
let
, কেবল কেন এটি প্রয়োজন হতে পারে তা ভেবে অবাক হলেন । ধন্যবাদ!
সুইফট 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
আমি এটিও জানি যে এরই মধ্যে উত্তর দেওয়া হয়েছে তবে আমি পূর্ববর্তী উত্তরগুলি গুটিয়ে রেখেছি:
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()
জন্য সুইফট 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))"
সুইফট ৩.০ এর জন্য এনএসবান্ডেল কাজ করে না, নিম্নলিখিত কোডটি পুরোপুরি কার্যকর হয়।
let versionNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString")
as! String
এবং কেবল বিল্ড নম্বরটির জন্য এটি হ'ল:
let buildNumberString =
Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
as! String
বিভ্রান্তিমূলকভাবে 'সিএফবান্ডেল ভার্সন' হ'ল জেনারেল>> পরিচয়ের জন্য এক্সকোডে প্রবেশ করা বিল্ড নম্বর।
এক্সকোড 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 ""
}
}
আমার উত্তর (আগস্ট 2015 এর মতো) দেওয়া সুইফটটি বিকশিত হতে থাকে:
let version = NSBundle.mainBundle().infoDictionary!["CFBundleVersion"] as! String
আমি ইউআইএ অ্যাপ্লিকেশনটির জন্য একটি এক্সটেনশন তৈরি করেছি।
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
}
}
দৃষ্টি আকর্ষণ: আপনার যদি অ্যাপ্লিকেশন সংস্করণ বা বিল্ড সেট না করা থাকে তবে যদি আপনি ব্যবহার করার চেষ্টা করেন তবে ক্র্যাশ হওয়ার কারণ হতে পারে আপনার যদি এখানে ব্যবহার করা উচিত! আবদ্ধ করা।
এখানে সুইফট ৩.২-এর একটি আপডেট সংস্করণ রয়েছে:
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
// প্রথমে sচ্ছিক যিনিওবজেক্ট হিসাবে সংজ্ঞা দিয়ে এনএসবজেক্টটি পান
let nsObject: AnyObject? = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as AnyObject
// তারপরে অবজেক্টটিকে কেবল স্ট্রিং হিসাবে কাস্ট করুন তবে সাবধান থাকুন, আপনি নিলে ডাবল চেক করতে চাইতে পারেন
let version = nsObject as! String
অ্যাপ্লিকেশন সংস্করণটি ইন্ট হিসাবে ফেরত দেওয়ার জন্য সহজ ইউটিলিটি ফাংশন
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
এ উপলব্ধ GitHub এবং সম্পূর্ণরূপে দ্রুতগতি প্রতিটি সংস্করণের জন্য নথিভুক্ত (দেখুন 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 ফেরত আসবে যা বর্তমান বিল্ড সংখ্যার চেয়ে কম। এই জাতীয় স্ক্রিনটি নতুন ব্যবহারকারীদের কাছে না দেখানোর জন্য, প্রথম লগইনের পরে বা অন বোর্ডিং সম্পূর্ণ হওয়ার পরে কেবল বিল্ড নম্বর যুক্ত করুন।