আইওএস সংস্করণ কীভাবে চেক করবেন?


848

আমি যাচাই করতে চাই iOSযে ডিভাইসের সংস্করণটি 3.1.3 আমি এর চেয়ে বেশি চেষ্টা করেছিলাম যেমন:

[[UIDevice currentDevice].systemVersion floatValue]

তবে এটি কার্যকর হয় না, আমি কেবল একটি চাই:

if (version > 3.1.3) { }

আমি কীভাবে এটি অর্জন করতে পারি?


5
মডারেটর দ্রষ্টব্য : সময়ের সাথে সাথে এই প্রশ্নটি 30 টিরও বেশি উত্তর সংগ্রহ করেছে। নতুন উত্তর যুক্ত করার আগে নিশ্চিত হয়ে নিন যে ইতিমধ্যে আপনার সমাধান সরবরাহ করা হয়নি।
ম্যাট

3
এক্সকোড 7 শুরু হচ্ছে সুইফটে if #available(iOS 9, *) {}। এক্সকোড 9 শুরু, if (@available(iOS 11, *)) {}উদ্দেশ্য-গ।
সিউর

উত্তর:


1001

দ্রুত উত্তর ...


সুইফট ২.০ হিসাবে, আপনি #availableএকটি ifবা guardসুরক্ষা কোড ব্যবহার করতে পারেন যা কেবলমাত্র নির্দিষ্ট সিস্টেমে চালানো উচিত।

if #available(iOS 9, *) {}


অবজেক্টিভ-সি-তে আপনাকে সিস্টেমের সংস্করণটি পরীক্ষা করতে হবে এবং তুলনা করতে হবে।

[[NSProcessInfo processInfo] operatingSystemVersion] আইওএস 8 এবং তারপরে।

এক্সকোড 9 হিসাবে:

if (@available(iOS 9, *)) {}


পুরো উত্তর ...

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

এপিআইগুলির উপস্থিতি যাচাই করা হচ্ছে:

উদাহরণস্বরূপ, আপনি UIPopoverControllerএটি ব্যবহার করে বর্তমান ডিভাইসে উপলব্ধ কিনা তা পরীক্ষা করতে পারেন NSClassFromString:

if (NSClassFromString(@"UIPopoverController")) {
    // Do something
}

দুর্বলভাবে সংযুক্ত ক্লাসগুলির জন্য, সরাসরি ক্লাসে বার্তা দেওয়া নিরাপদ। উল্লেখযোগ্যভাবে, এটি ফ্রেমওয়ার্কগুলির জন্য কাজ করে যা স্পষ্টভাবে "প্রয়োজনীয়" হিসাবে লিঙ্কযুক্ত নয়। অনুপস্থিত শ্রেণীর জন্য, শর্তটি ব্যর্থ করে, অভিব্যক্তিটি শূন্য করতে মূল্যায়ন করে:

if ([LAContext class]) {
    // Do something
}

কিছু ক্লাস, যেমন CLLocationManagerএবং UIDevice, ডিভাইস ক্ষমতা যাচাই করার জন্য পদ্ধতি সরবরাহ করে:

if ([CLLocationManager headingAvailable]) {
    // Do something
}

প্রতীকের উপস্থিতি যাচাই করা হচ্ছে:

খুব মাঝেমধ্যে, আপনাকে অবশ্যই একটি ধ্রুবকের উপস্থিতি পরীক্ষা করতে হবে। এটি আইওএস 8 এ এসেছিল যার UIApplicationOpenSettingsURLStringমাধ্যমে সেটিংস অ্যাপ্লিকেশন লোড করতে ব্যবহৃত হয়েছিল -openURL:। আইওএস-এর পূর্বে মানটির অস্তিত্ব ছিল না this

if (&UIApplicationOpenSettingsURLString != NULL) {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}

অপারেটিং সিস্টেম সংস্করণের তুলনায়:

ধরে নেওয়া যাক অপারেটিং সিস্টেমের সংস্করণটি পরীক্ষা করার জন্য তুলনামূলকভাবে বিরল প্রয়োজনের মুখোমুখি হয়েছি। আইওএস 8 এবং তদূর্ধ্বকে লক্ষ্যযুক্ত প্রকল্পগুলির NSProcessInfoজন্য ত্রুটির কম সম্ভাবনা সহ সংস্করণ তুলনা করার পদ্ধতি অন্তর্ভুক্ত রয়েছে:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

পুরোনো সিস্টেমের লক্ষ্য করে প্রকল্প ব্যবহার করতে পারেন systemVersionউপর UIDevice। অ্যাপল এটি তাদের জিএলএসপ্রাইট নমুনা কোডে ব্যবহার করে ।

// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
    displayLinkSupported = TRUE;
}

যদি আপনি যে কারণেই সিদ্ধান্ত নিতে systemVersionচান তবে এটি এটিকে স্ট্রিং হিসাবে বিবেচনা করবেন বা প্যাচ রিভিশন নম্বরটি কেটে নেওয়ার ঝুঁকি রাখুন (উদাঃ 3.1.2 -> 3.1))


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

2
আইওএস 3.2 পাঠাতে বলে মনে হচ্ছে না -viewWillAppearএকটি UISplitViewController। আমার হ্যাকটি <আইওএস ৪.০ কিনা তা নির্ধারণ করা এবং এটি রুট ভিউ-তে নিজেকে ডিটেইল ভিউ কন্ট্রোলারে প্রেরণ করা হয় -didSelectRowAtIndexPath
jww

10
আপনাকে এখানে কিছুটা যত্নবান হওয়া দরকার কারণ [@"10.0" compare:@"10" options:NSNumericSearch]রিটার্নগুলি NSOrderedDescending, যা সম্ভবত উদ্দেশ্যযুক্ত নয়। (আমি আশা করতে পারি NSOrderedSame।) এটি কমপক্ষে একটি তাত্ত্বিক সম্ভাবনা।
এসকে

হ্যাঁ, আমি ঠিক এমন একটি মামলার মুখোমুখি হয়েছি যেখানে একটি আইওএস 5 বাগ সংঘটিত হওয়া দরকার। respondsToSelectorET AL কাজটি করবে না - সংস্করণগুলির তুলনা করতে হবে।
হট লিক্স

2
টিভিস প্রবর্তনের সাথে এটি আরও গুরুত্বপূর্ণ হয়ে উঠেছে। দেখুন TVos 9.0 ফিরে আসবে যখন 9.1 এসডিকে ব্যবহৃত হবে। সুতরাং ক্লাস বা পদ্ধতিটি পরীক্ষা করুন (নির্বাচক) সবচেয়ে ভাল উপায়, এর পরে আপনার অবশ্যই এটি পরীক্ষা করা উচিত NSFoundationVersionNumberএবং যদি সম্ভব না হয় তবে আপনি যদি সিস্টেমের সংস্করণগুলি চালু করে থাকেন UIDevice
rckoenes

1055
/*
 *  System Versioning Preprocessor Macros
 */ 

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */ 

if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
    ...
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
    ...
}

20
+1 টি। এটিকে শিরোনামে রাখলে যেখানে আপনি যেখানে প্রয়োজন সেখানে অন্তর্ভুক্ত করতে পারেন আমি ভাবতে পারি সবচেয়ে সহজ সমাধান। বেশ কয়েকটি ক্ষেত্রে এটি এনএসক্লাসফ্র্যামস্ট্রিং ব্যবহারের জন্য প্রাপ্যতার জন্য যাচাই করার চেয়ে আরও নির্ভরযোগ্য। আর একটি উদাহরণ আইএডি-তে রয়েছে, যেখানে আপনি ৪.২ এর আগে কোনও সংস্করণে ADBannerContentSizeIdentifierPortrait ব্যবহার করেন আপনি EXEC_BAD_ACCESS পাবেন, তবে সমতুল্য ADBannerContentSizeIdentifier320x50 4.1 এর পরে অবচিত করা হবে।
রব

1
আমি অন্য একটি জায়গা যা ব্যবহার করি তা হ'ল ইউআইপেজভিউ কনট্রোলার এবং শৈলীটি ইউআইপেজভিউ কনট্রোলার ট্রানসিশনস্টাইলস্ক্রোলকে iOS6 এ সেট করা।
পল ডি ল্যাঞ্জ

7
এটি 10s এর জন্য কাজ করে না। উদাহরণস্বরূপ 4.10 এবং 4.9 তুলনা ভুল ফলাফল দিতে হবে।
pzulw

7
Alচ্ছিক .0নম্বর ব্যবহার করার সময় একটি খুব সতর্কতা অবলম্বন করা উচিত । উদাহরণস্বরূপ SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")আইওএস 7.0 এ ভুল ফলাফল দেয়।
ইয়ান

1
আমি এটি আমার .pch ফাইলে রাখার পরীক্ষা করেছি এবং এটি দুর্দান্ত কাজ করে (কমপক্ষে
এক্সকোড

253

অফিসিয়াল অ্যাপল ডক্স দ্বারা প্রস্তাবিত হিসাবে : আপনি শিরোলেখ ফাইল NSFoundationVersionNumberথেকে, ব্যবহার করতে পারেন NSObjCRuntime.h

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}

40
+1 এটি এখানে সবচেয়ে নিরাপদ এবং সবচেয়ে সঠিক বিকল্প।
এমএক্সসিএল

8
উম .. NSFoundationVersionNumber_iOS_6_1আইওএস 5 এসডিকে নেই।
Kjuly

2
@ কোজলি আপনি নিজের দ্বারা নিখোঁজ সংস্করণগুলি সংজ্ঞায়িত করতে পারেন: github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h (102-130 লাইনে একবার দেখুন)
কার্লজে

3
না, আপনি ভুল, এনএসফাউন্ডেশন ভার্সন নাম্বার_আইওএস_7০ টি বিদ্যমান নেই। কিন্তু ভাল, আমরা এটা দিয়ে সংজ্ঞায়িত করতে পারে #ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif। এরকম গোলযোগ এড়াতে, আমি ইয়াসির্মটুর্ক থেকে SYSTEM_VERSION_LESS_THAN (v) ম্যাক্রোর সাথে গিয়েছিলাম
Cœur

7
না, তবে অ্যাপল NSFoundationVersionNumber_iOS_8_0আইওএস 9. এ যুক্ত করবে কেবল সন্ধান করুনNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
CarlJ

111

এক্সকোড 9 শুরু, উদ্দেশ্য-সি তে :

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

Xcode 7, থেকে শুরু করে সুইফট :

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

সংস্করণটির জন্য, আপনি মেজর, মাইনর বা প্যাচ নির্দিষ্ট করতে পারেন ( সংজ্ঞার জন্য http://semver.org/ দেখুন )। উদাহরণ:

  • iOS 11এবং iOS 11.0একই ন্যূনতম সংস্করণ
  • iOS 10, iOS 10.3, iOS 10.3.1বিভিন্ন সংক্ষিপ্ত সংস্করণ

আপনি যে কোনও সিস্টেমের জন্য মানগুলি ইনপুট করতে পারেন:

  • iOS, macOS, watchOS,tvOS

আমার একটি শুঁটি থেকে নেওয়া প্রকৃত কেস উদাহরণ :

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

ডকুমেন্টেশন


এটি কীভাবে উদ্দেশ্য-সি বা সুইফ্টের মধ্যে উল্টানো যায়?
লেগোলেস

@Legolessif (...) {} else { ... }
Coeur

বিবৃতিতে guardব্লকটি খোলা এবং ইনডেন্টের পরিবর্তে আমি উদ্দেশ্য-সি ব্যবহার করতে পারি else?
লেগোলেস

@ লেগোলেস না, কেবল একটি খালি ifব্লক ব্যবহার করুন যার পরে এন else
সিউর

1
এটি আমার কাছে বর্তমানে সমাধান, কেবলমাত্র অপ্রয়োজনীয় ইন্ডেন্টেশন এবং খালি ifব্লকগুলি এড়াতে চেয়েছিলেন ।
লেগোলেস

45

এটি এক্সকোডে সামঞ্জস্যপূর্ণ এসডিকে সংস্করণ পরীক্ষা করার জন্য ব্যবহৃত হয়, আপনার যদি এক্সকোডের বিভিন্ন সংস্করণ বা একই কোডটি ভাগ করে নেওয়া বিভিন্ন এসডিকে সমর্থন করে একাধিক প্রকল্প সহ একটি বড় দল থাকে:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

আপনি যা চান তা হ'ল ডিভাইসে আইওএস সংস্করণ পরীক্ষা করা। আপনি এটি দিয়ে এটি করতে পারেন:

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
  //older than iOS 8 code here
} else {
  //iOS 8 specific code here
}

সুইফ্ট সংস্করণ:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

দ্রুততম সংস্করণগুলিতে এটি ব্যবহার করা উচিত:

if #available(iOS 12, *) {
    //iOS 12 specific code here
} else {
    //older than iOS 12 code here
}

37

চেষ্টা করুন:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
    // OS version >= 3.1.3
} else {
    // OS version < 3.1.3
}

2
@ "৩.১.৩" এবং সিস্টেম ভার্সন উভয়ই এনএসএসআরংস হওয়ায় এখানে কেন আদেশটিকে বিপরীত করে তুলনা সংরক্ষণ করবেন না? উদাহরণস্বরূপ: `if ([@" "3.1.3" তুলনা করুন: [ইউআইডিভাইস বর্তমান ডিভাইস]]। সিস্টেম ভার্সন বিকল্পগুলি: এনএসনিউমারিকস অনুসন্ধান] == এনএসআরডার্ডডেসেন্ডিং); // ওএস সংস্করণ> = 3.1.3; অন্যটি ওএস সংস্করণ <3.1.3`
রব

3
এটি করা যুক্তি কম পরিষ্কার করতে পারে। অপারেশনটি সমতুল্য হওয়া উচিত।
জোনাথন গ্রিনস্পান

1
দুটি পূর্ণসংখ্যার মধ্যে একটি তুলনা অবশ্যই খুব ব্যয়বহুল নয়।
কেপিএম

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

35

পছন্দসই পদ্ধতি

সুইফট ২.০ এ অ্যাপল আরও বেশি সুবিধাজনক সিনট্যাক্স ব্যবহার করে প্রাপ্যতা যাচাই করেছে ( এখানে আরও পড়ুন )। এখন আপনি একটি ক্লিনার সিনট্যাক্স সহ ওএস সংস্করণটি পরীক্ষা করতে পারেন:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

এটি চেকিং respondsToSelectorইত্যাদির উপর পছন্দসই ( সুইটটিতে নতুন কী রয়েছে )। আপনি যদি আপনার কোডটি সঠিকভাবে রক্ষণ না করেন তবে সংকলক সর্বদা আপনাকে সতর্ক করবে।


প্রাক সুইফট ২.০

আইওএস 8 এ নতুন NSProcessInfoআরও ভাল শব্দার্থক সংস্করণ চেকের অনুমতি দিচ্ছে।

আইওএস 8 এবং আরও বেশিতে স্থাপন করা

আইওএস .0.০ বা তারপরের ন্যূনতম স্থাপনার লক্ষ্যমাত্রার জন্য , ব্যবহার করুন NSProcessInfo operatingSystemVersionবা isOperatingSystemAtLeastVersion

এটি নিম্নলিখিত উত্পাদন করবে:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //current version is >= (8.1.2)
} else {
    //current version is < (8.1.2)
}

আইওএস 7-এ স্থাপন করা হচ্ছে

ন্যূনতম স্থাপনার টার্গেটের জন্য সামঞ্জস্যপূর্ণ iOS 7.1 বা নীচে, সঙ্গে তুলনা ব্যবহার NSStringCompareOptions.NumericSearchউপর UIDevice systemVersion

এতে ফল পাওয়া যাবে:

let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
    case .OrderedSame, .OrderedDescending:
        //current version is >= (3.1.3)
        break
    case .OrderedAscending:
        //current version is < (3.1.3)
        fallthrough
    default:
        break;
}

আরো এ পড়া NSHipster


9

আমি সবসময় আমার কনস্ট্যান্টস ফাইল ফাইলটিতে রাখি:

#define IS_IPHONE5 (([[UIScreen mainScreen] bounds].size.height-568)?NO:YES) 
#define IS_OS_5_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0)
#define IS_OS_6_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 6.0)
#define IS_OS_7_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
#define IS_OS_8_OR_LATER    ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

গ্রেট। বেটার মধ্যে এই স্থানে .pchআপনার উপর XCode প্রকল্প ফাইল
বৈভব Jhaveri

1
আমি আমার সমস্ত কনস্ট্যান্টকে আমার Constants.hফাইলে আমদানি করে আমার pchফাইলে রাখি ।
সেজেভ

6
+(BOOL)doesSystemVersionMeetRequirement:(NSString *)minRequirement{

// eg  NSString *reqSysVer = @"4.0";


  NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

  if ([currSysVer compare:minRequirement options:NSNumericSearch] != NSOrderedAscending)
  {
    return YES;
  }else{
    return NO;
  }


}

@ জিফ পিরিয়ডগুলি সংস্করণে দশমিক পয়েন্ট নয় এবং এটি প্রাসঙ্গিক। আপনার উত্তর পিরিয়ড উপেক্ষা করে না, এটি যদি তা করে তবে এটি ব্যর্থ হয়। সংস্করণে প্রতিটি পিরিয়ড পৃথক উপাদান একটি সম্পূর্ণ সংখ্যা। উদাহরণস্বরূপ: '1.23.45' '1.2.345' এর চেয়ে বড় কারণ দ্বিতীয় উপাদান '23 '' 2 'এর চেয়ে বড়। আপনি যদি পিরিয়ডগুলি মুছে ফেলেন তবে এটি একই সংখ্যা হবে।
আন্দ্রেস ক্যানেলা

6

এনভি- আইওএস -সংস্করণ প্রকল্পে অন্তর্ভুক্ত সংস্করণ শ্রেণীর সাথে (অ্যাপাচি লাইসেন্স, সংস্করণ ২.০) আইওএস সংস্করণ পাওয়া এবং তুলনা করা সহজ। নীচের উদাহরণের কোডগুলি আইওএস সংস্করণটিকে ফেলা করে এবং সংস্করণটি 6.0 এর চেয়ে বড় বা সমান কিনা তা পরীক্ষা করে।

// Get the system version of iOS at runtime.
NSString *versionString = [[UIDevice currentDevice] systemVersion];

// Convert the version string to a Version instance.
Version *version = [Version versionWithString:versionString];

// Dump the major, minor and micro version numbers.
NSLog(@"version = [%d, %d, %d]",
    version.major, version.minor, version.micro);

// Check whether the version is greater than or equal to 6.0.
if ([version isGreaterThanOrEqualToMajor:6 minor:0])
{
    // The iOS version is greater than or equal to 6.0.
}

// Another way to check whether iOS version is
// greater than or equal to 6.0.
if (6 <= version.major)
{
    // The iOS version is greater than or equal to 6.0.
}

প্রকল্প পৃষ্ঠা: এনভি-আইওএস-সংস্করণ
তাকাহিকো কাওয়াসাকি / এনভি-আইওস-সংস্করণ

ব্লগ: রানটাইমের সময় সংস্করণ শ্রেণীর সাথে আইওএস সংস্করণটি পান এবং তুলনা করুন ভার্সন ক্লাসের সাথে রানটাইমে আইওএস সংস্করণটি
পান এবং তুলনা করুন


5

সুইফট ফরগেট [[ইউআইডিভাইস কারেন্ট ডিভাইস] সিস্টেম ভার্সন] এবং এনএসফাউন্ডেশন ভার্সন নাম্বার ব্যবহার করে সিস্টেম সংস্করণটি পরীক্ষা করার নতুন উপায়।

আমরা এনএসপি প্রসেসইনফো -আইস অপারেটিং সিস্টেম অ্যাটলিস্ট ভার্সন ব্যবহার করতে পারি

     import Foundation

     let yosemite = NSOperatingSystemVersion(majorVersion: 10, minorVersion: 10, patchVersion: 0)
     NSProcessInfo().isOperatingSystemAtLeastVersion(yosemite) // false

5

UIDevice + + IOSVersion.h

@interface UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion

@end

UIDevice + + IOSVersion.m

#import "UIDevice+IOSVersion.h"

@implementation UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedSame;
}

+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedDescending;
}

+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedDescending;
}

@end

4

সাধারণভাবে এটি জিজ্ঞাসা করা ভাল যে কোনও বস্তু কোনও প্রদত্ত নির্বাচককে সম্পাদন করতে পারে, পরিবর্তে কোনও সংস্করণ নম্বর উপস্থিত রয়েছে কিনা তা স্থির করার জন্য এটি পরীক্ষা করে।

যখন এটি কোনও বিকল্প নয়, আপনার এখানে কিছুটা সতর্কতা অবলম্বন করা উচিত কারণ যেগুলি [@"5.0" compare:@"5" options:NSNumericSearch]রিটার্নগুলি NSOrderedDescendingসম্ভবত মোটেও উদ্দিষ্ট নয়; আমি NSOrderedSameএখানে আশা করতে পারেন । এটি অন্তত একটি তাত্ত্বিক উদ্বেগ, এটি আমার মতে বিপরীতমুখী worth

এছাড়াও বিবেচনা করা মূল্যবান হ'ল খারাপ সংস্করণ ইনপুট হওয়ার সম্ভাবনা যা তুলনামূলক যুক্তিযুক্ত নয়। অ্যাপল তিন পূর্বনির্ধারিত ধ্রুবক সরবরাহ NSOrderedAscending, NSOrderedSameএবং NSOrderedDescendingকিন্তু আমি নামক কিছু জিনিস জন্য ব্যবহার মনে করতে পারেন NSOrderedUnorderedআমি দুটি জিনিস না তুলনা করতে পারবেন এবং আমি এই ইঙ্গিত একটি মান ফিরে যেতে চাই ইভেন্টে।

সর্বোপরি, এও অসম্ভব যে অ্যাপল কোনও দিন তাদের তিনটি পূর্বনির্ধারিত ধ্রুবককে প্রসারিত করে বিভিন্ন প্রকারের মূল্যের মানকে বাড়িয়ে তুলবে, তুলনাটি != NSOrderedAscendingমূর্খতার সাথে তুলবে।

এই সঙ্গে, নিম্নলিখিত কোড বিবেচনা করুন।

typedef enum {kSKOrderedNotOrdered = -2, kSKOrderedAscending = -1, kSKOrderedSame = 0, kSKOrderedDescending = 1} SKComparisonResult;

@interface SKComparator : NSObject
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo;
@end

@implementation SKComparator
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo {
  if (!vOne || !vTwo || [vOne length] < 1 || [vTwo length] < 1 || [vOne rangeOfString:@".."].location != NSNotFound ||
    [vTwo rangeOfString:@".."].location != NSNotFound) {
    return SKOrderedNotOrdered;
  }
  NSCharacterSet *numericalCharSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
  NSString *vOneTrimmed = [vOne stringByTrimmingCharactersInSet:numericalCharSet];
  NSString *vTwoTrimmed = [vTwo stringByTrimmingCharactersInSet:numericalCharSet];
  if ([vOneTrimmed length] > 0 || [vTwoTrimmed length] > 0) {
    return SKOrderedNotOrdered;
  }
  NSArray *vOneArray = [vOne componentsSeparatedByString:@"."];
  NSArray *vTwoArray = [vTwo componentsSeparatedByString:@"."];
  for (NSUInteger i = 0; i < MIN([vOneArray count], [vTwoArray count]); i++) {
    NSInteger vOneInt = [[vOneArray objectAtIndex:i] intValue];
    NSInteger vTwoInt = [[vTwoArray objectAtIndex:i] intValue];
    if (vOneInt > vTwoInt) {
      return kSKOrderedDescending;
    } else if (vOneInt < vTwoInt) {
      return kSKOrderedAscending;
    }
  }
  if ([vOneArray count] > [vTwoArray count]) {
    for (NSUInteger i = [vTwoArray count]; i < [vOneArray count]; i++) {
      if ([[vOneArray objectAtIndex:i] intValue] > 0) {
        return kSKOrderedDescending;
      }
    }
  } else if ([vOneArray count] < [vTwoArray count]) {
    for (NSUInteger i = [vOneArray count]; i < [vTwoArray count]; i++) {
      if ([[vTwoArray objectAtIndex:i] intValue] > 0) {
        return kSKOrderedAscending;
      }
    }
  }
  return kSKOrderedSame;
}
@end

4
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        // Your code here
}

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


4

পার্টিতে কিছুটা দেরি হলেও iOS 8.0 এর আলোকে এটি প্রাসঙ্গিক হতে পারে:

যদি আপনি ব্যবহার এড়াতে পারেন

[[UIDevice currentDevice] systemVersion]

পরিবর্তে কোনও পদ্ধতি / শ্রেণি / অন্য যাই হোক না কেন তার অস্তিত্ব পরীক্ষা করুন।

if ([self.yourClassInstance respondsToSelector:@selector(<yourMethod>)]) 
{ 
    //do stuff 
}

আমি এটি অবস্থান ব্যবস্থাপকের জন্য দরকারী বলে মনে করেছি যেখানে আমাকে iOS 8.0 এর জন্য যখন অনুরোধটি কল করতে হবে তবে আইওএস <8 এর জন্য পদ্ধতিটি উপলভ্য নয় is



3

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে কারওের মধ্যে সংকলন-সময় ম্যাক্রোগুলির উল্লেখ করা উচিত ছিল Availability.h। এখানে অন্যান্য সমস্ত পদ্ধতি হ'ল রানটাইম সমাধান, এবং শিরোনাম ফাইল, শ্রেণি বিভাগ বা আইভার সংজ্ঞায় কাজ করবে না।

এই পরিস্থিতিতে ব্যবহার করুন

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_6_0
  // iOS 6+ code here
#else
  // Pre iOS 6 code here
#endif

h / t এই উত্তর


3
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

তারপরে একটি শর্ত যুক্ত করুন: -

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
   //Your code
}       

2

এখানে 7.0 বা 6.0.3 এর মতো সংস্করণ রয়েছে, তাই আমরা তুলনা করার জন্য সংস্করণটিকে সংখ্যায় রূপান্তর করতে পারি। সংস্করণ যদি 7.০ এর মতো হয় তবে কেবল এটিতে অন্য একটি ".0" যুক্ত করুন এবং তার সংখ্যার মানটি নিন।

 int version;
 NSString* iosVersion=[[UIDevice currentDevice] systemVersion];
 NSArray* components=[iosVersion componentsSeparatedByString:@"."];
 if ([components count]==2) {
    iosVersion=[NSString stringWithFormat:@"%@.0",iosVersion];

 }
 iosVersion=[iosVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
 version=[iosVersion integerValue];

6.0.0 এর জন্য

  if (version==600) {
    // Do something
  }

7.0 এর জন্য

 if (version==700) {
   // Do something
 }

কেবল দশমিক পয়েন্টগুলি অপসারণ করা ভুল পদ্ধতির। এমন একটি উপাদান বিবেচনা করুন যা 1 টির বেশি অক্ষরের দীর্ঘ, যেমন 6.1.10। তাহলে এই অ্যালগরিদম ফল দেবে 6110 > 700, যা সঠিক নয়।
২:33

আমি বুঝতে পারছি অ্যাপল নতুন সংস্করণ ঘুরিয়ে তুলতে খারাপ তবে বেশিরভাগ সময় সংস্করণে দ্বিতীয় সংখ্যাটি কখনই 5 এর বাইরে যায় না, সুতরাং 10 প্রশ্নবিদ্ধ। এটি একটি অ্যাডহক পদ্ধতির তাই এটি যদি 2 টি উপাদানগুলির জন্য কেস পরিচালনা করে তবে আপনি ম্যানুয়ালি করতে চাইলে আপনি চারটি কেসকে হ্যান্ডেল করতে এটি পরিবর্তন করতে পারেন। যাইহোক, এই পদ্ধতির আইওএস 6 বা of এর সময়ে মন্তব্য করা হয়েছিল আইওএস 9 এবং 10 এর চেক করার আরও ভাল উপায় রয়েছে যেমন # উপলভ্য।
নক্সির

2

নীচের কোডটি ব্যবহার করে দেখুন:

NSString *versionString = [[UIDevice currentDevice] systemVersion];


1

ইয়াসিমটুরকস দ্রবণটির ভিন্নতা হিসাবে, আমি পাঁচটি ম্যাক্রোর পরিবর্তে একটি ফাংশন এবং কয়েকটি এনাম মান সংজ্ঞায়িত করেছি। আমি এটি আরও মার্জিত বলে মনে করি, তবে এটি স্বাদের বিষয়।

ব্যবহার:

if (systemVersion(LessThan, @"5.0")) ...

.h ফাইল:

typedef enum {
  LessThan,
  LessOrEqual,
  Equal,
  GreaterOrEqual,
  GreaterThan,
  NotEqual
} Comparison;

BOOL systemVersion(Comparison test, NSString* version);

.m ফাইল:

BOOL systemVersion(Comparison test, NSString* version) {
  NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare: version options: NSNumericSearch];
  switch (test) {
    case LessThan:       return result == NSOrderedAscending;
    case LessOrEqual:    return result != NSOrderedDescending;
    case Equal:          return result == NSOrderedSame;
    case GreaterOrEqual: return result != NSOrderedAscending;
    case GreaterThan:    return result == NSOrderedDescending;
    case NotEqual:       return result != NSOrderedSame;
  }
}

আপনার অ্যাপ্লিকেশনটির উপসর্গটি নামের সাথে যুক্ত করা উচিত, বিশেষত Comparisonপ্রকারে।


1

রেফার্ড প্রস্তাবিত উপায়ে ব্যবহার করুন ... যদি শিরোনাম ফাইলগুলিতে কোনও সংজ্ঞা না থাকে, আপনি সর্বদা পছন্দসই আইওএস ভার্সিয়ানের ডিভাইস দিয়ে কনসোলে এটি মুদ্রণ করতে পারেন।

- (BOOL) isIOS8OrAbove{
    float version802 = 1140.109985;
    float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
    NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
    if (NSFoundationVersionNumber >= version8){
        return true;
    }
    return false;
}

1

সুইফটে আইওএস সংস্করণ পরীক্ষা করার সমাধান

switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
    case .OrderedAscending:
       println("iOS < 8.0")

    case .OrderedSame, .OrderedDescending:
       println("iOS >= 8.0")
}

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

( এই তথ্যের উত্স )

সুইফটে শ্রেণীর অস্তিত্ব পরীক্ষা করার সমাধান olution

if (objc_getClass("UIAlertController") == nil) {
   // iOS 7
} else {
   // iOS 8+
}

ব্যবহার করবেন না if (NSClassFromString("UIAlertController") == nil)কারণ এটি আইওএস 7.1 এবং 8.2 ব্যবহার করে আইওএস সিমুলেটরটিতে সঠিকভাবে কাজ করে তবে আপনি যদি আইওএস 7.1 ব্যবহার করে কোনও সত্যিকারের ডিভাইসে পরীক্ষা করেন তবে দুর্ভাগ্যক্রমে আপনি লক্ষ্য করবেন যে আপনি কোড স্নিপেটের অন্য অংশটি কখনও পাস করবেন না।


কেন ভোট কম? এই সমাধানটি সুইফট এবং যে কোনও আইওএস সংস্করণ ব্যবহার করে নিখুঁতভাবে কাজ করে। বিশেষত শ্রেণীর অস্তিত্বের পরীক্ষা করা ঠিক নিখুঁত।
কিং-উইজার্ড

1
#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

0

ওবজে-সি ++ 11 এর আরও জেনেরিক সংস্করণ (আপনি সম্ভবত এই স্টাটির কিছুটি এনএসএসটিং / সি ফাংশনগুলির সাথে প্রতিস্থাপন করতে পারেন তবে এটি কম ভারবোজ This এটি আপনাকে দুটি প্রক্রিয়া দেয় split স্প্লিট সিস্টেম ভার্সন আপনাকে সমস্ত অংশের একটি অ্যারে দেয় যা দরকারী যদি আপনি কেবল প্রধান সংস্করণটি (যেমন switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }) স্যুইচ করতে চান ।

#include <boost/lexical_cast.hpp>

- (std::vector<int>) splitSystemVersion {
    std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
    std::vector<int> versions;
    auto i = version.begin();

    while (i != version.end()) {
        auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
        std::string versionPart(i, nextIllegalChar);
        i = std::find_if(nextIllegalChar, version.end(), isdigit);

        versions.push_back(boost::lexical_cast<int>(versionPart));
    }

    return versions;
}

/** Losslessly parse system version into a number
 * @return <0>: the version as a number,
 * @return <1>: how many numeric parts went into the composed number. e.g.
 * X.Y.Z = 3.  You need this to know how to compare again <0>
 */
- (std::tuple<int, int>) parseSystemVersion {
    std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
    int versionAsNumber = 0;
    int nParts = 0;

    auto i = version.begin();
    while (i != version.end()) {
        auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
        std::string versionPart(i, nextIllegalChar);
        i = std::find_if(nextIllegalChar, version.end(), isdigit);

        int part = (boost::lexical_cast<int>(versionPart));
        versionAsNumber = versionAsNumber * 100 + part;
        nParts ++;
    }

    return {versionAsNumber, nParts};
}


/** Assume that the system version will not go beyond X.Y.Z.W format.
 * @return The version string.
 */
- (int) parseSystemVersionAlt {
    std::string version = [[[UIDevice currentDevice] systemVersion] UTF8String];
    int versionAsNumber = 0;
    int nParts = 0;

    auto i = version.begin();
    while (i != version.end() && nParts < 4) {
        auto nextIllegalChar = std::find_if(i, version.end(), [] (char c) -> bool { return !isdigit(c); } );
        std::string versionPart(i, nextIllegalChar);
        i = std::find_if(nextIllegalChar, version.end(), isdigit);

        int part = (boost::lexical_cast<int>(versionPart));
        versionAsNumber = versionAsNumber * 100 + part;
        nParts ++;
    }

    // don't forget to pad as systemVersion may have less parts (i.e. X.Y).
    for (; nParts < 4; nParts++) {
        versionAsNumber *= 100;
    }

    return versionAsNumber;
}


0
float deviceOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
float versionToBeCompared = 3.1.3; //(For Example in your case)

if(deviceOSVersion < versionToBeCompared)
   //Do whatever you need to do. Device version is lesser than 3.1.3(in your case)
else 
   //Device version should be either equal to the version you specified or above

float versionToBeCompared = 3.1.3;এমনকি সংকলন করতে পারে না।
পাইং

0

আসলে কাজ করে এমন সুইফ্ট উদাহরণ:

switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
    println("iOS >= 8.0")
case .OrderedAscending:
    println("iOS < 8.0")
}

এটি 8.0 এর অধীনে কাজ করে না বলে এনএসপ্রোসেসইনফো ব্যবহার করবেন না, সুতরাং এটি 2016 পর্যন্ত অব্যর্থ use


0

এখানে একটি দ্রুত সংস্করণ:

struct iOSVersion {
    static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue
    static let iOS7 = (Version.SYS_VERSION_FLOAT < 8.0 && Version.SYS_VERSION_FLOAT >= 7.0)
    static let iOS8 = (Version.SYS_VERSION_FLOAT >= 8.0 && Version.SYS_VERSION_FLOAT < 9.0)
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)
}

ব্যবহার:

if iOSVersion.iOS8 {
    //Do iOS8 code here
}

আমি মনে করি সংস্করণটি 3-6 লাইনে iOS সংস্করণ হওয়া উচিত struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }
কাস্তর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.