কিভাবে iOS সংস্করণ চেক?




objective-c (20)

আমি ডিভাইসটির iOS সংস্করণ 3.1.3 চেয়ে বড় কিনা তা পরীক্ষা করতে চাই।

[[UIDevice currentDevice].systemVersion floatValue]

কিন্তু এটি কাজ করে না, আমি শুধু একটি চাই:

if (version > 3.1.3) { }

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


পছন্দের পদ্ধতি

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

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

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

প্রাক সুইফ্ট 2.0

আইওএস 8 এ নতুন NSProcessInfo ভালো সিমন্টিক সংস্করণ চেকের জন্য অনুমতি দেয়।

আইওএস 8 এবং বৃহত্তর উপর স্থাপন

আইওএস 8.0 এর উপরে বা isOperatingSystemAtLeastVersion সর্বনিম্ন স্থাপনা লক্ষ্যগুলির জন্য, NSProcessInfo operatingSystemVersion 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 এ স্থাপন

আইওএস 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 এ আরো পড়ার।


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


সুইফ্ট 2.0 হিসাবে, আপনি if কোনও সিস্টেম বা সুরক্ষা ব্যবস্থার জন্য #available ব্যবহার করতে পারেন যা কেবল নির্দিষ্ট সিস্টেমে চালানো উচিত।

if #available(iOS 9, *) {}


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

[[NSProcessInfo processInfo] operatingSystemVersion] সিস্টেম [[NSProcessInfo processInfo] operatingSystemVersion] 8 এবং [[NSProcessInfo processInfo] operatingSystemVersion] iOS।

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

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


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

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

API এর উপস্থিতি জন্য চেক করা হচ্ছে:

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

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

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

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

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

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

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

অত্যন্ত মাঝে মাঝে, আপনি একটি ধ্রুবক উপস্থিতি জন্য চেক করতে হবে। এটি UIApplicationOpenSettingsURLString সেটিংস UIApplicationOpenSettingsURLString সাথে আইওএস 8 এ এসেছিল, যা -openURL: মাধ্যমে সেটিংস অ্যাপ্লিকেশন লোড করতে ব্যবহৃত হয়েছিল -openURL: মানটি iOS 8 এর আগে বিদ্যমান ছিল না। এই API টিতে পাস হওয়া ক্র্যাশ করবে, তাই আপনাকে প্রথমে ধ্রুবকের অস্তিত্ব যাচাই করতে যত্ন নিতে হবে:

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

অপারেটিং সিস্টেম সংস্করণের বিরুদ্ধে তুলনা:

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

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

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

// 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) কে হ্রাস করার ঝুঁকি রাখেন।


Obj-C ++ 11 এ আরো জেনেরিক সংস্করণ (সম্ভবত আপনি NSString / C ফাংশনগুলির সাথে কিছু উপাদান প্রতিস্থাপন করতে পারেন তবে এটি কম শব্দের অর্থ। এটি আপনাকে দুটি প্রক্রিয়া দেয়। SplitSystemVersion আপনাকে সমস্ত অংশগুলির একটি অ্যারে দেয় যা দরকারী আপনি শুধুমাত্র প্রধান সংস্করণটি স্যুইচ করতে চান (যেমন 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;
}

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

সংস্করণটির জন্য, আপনি MAJOR, MINOR বা প্যাচটি নির্দিষ্ট করতে পারেন (সংজ্ঞাগুলির জন্য 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
}

documentation


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

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

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

this উত্তর এইচ / টি


আমি সবসময় আমার Constants.h ফাইল যারা রাখা:

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

এটা চেষ্টা কর

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
// do some work
}

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

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

আপনি কি সত্যিই ডিভাইসে iOS সংস্করণ চেক করতে চান। আপনি এই সঙ্গে যে করতে পারেন:

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
}

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

আমরা NSProcessInfo -isOperatingSystemAtLeastVersion ব্যবহার করতে পারেন

     import Foundation

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

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

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

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

- (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;
}

শুধু OS সংস্করণ স্ট্রিং মান পুনরুদ্ধারের জন্য:

[[UIDevice currentDevice] systemVersion]


nv-ios-version আইওএস nv-ios-version প্রকল্প (অ্যাপাচি লাইসেন্স, সংস্করণ 2.0) এ থাকা সংস্করণ ক্লাসের সাথে, iOS সংস্করণটি পেতে এবং তুলনা করা সহজ। নীচের একটি উদাহরণ কোড iOS সংস্করণ dumps এবং সংস্করণ 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.
}

প্রকল্প পাতা: এনভি-আইওএস-সংস্করণ
nv-ios-version

ব্লগ: সংস্করণ ক্লাসের সাথে রানটাইমতে iOS সংস্করণটি পান এবং তুলনা করুন
সংস্করণ ক্লাসের সাথে রানটাইম এ iOS সংস্করণটি তুলুন এবং তুলনা করুন


সুইফ্টে iOS সংস্করণ চেক করার জন্য সমাধান

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

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

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

( NSHipster )

সুইফ্ট মধ্যে ক্লাস অস্তিত্ব পরীক্ষা করার জন্য সমাধান

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

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


দ্রুত কাজ যে আসলে কাজ করে:

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

এটি NSProcessInfo ব্যবহার করে না কারণ এটি 8.0 এর অধীনে কাজ করে না, তাই 2016 পর্যন্ত এটি বেশ বেশ অর্থহীন


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

#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

if (_kisiOS7) {
            NSLog(@"iOS7 or greater")
} 
else {
           NSLog(@"Less than iOS7");
}

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

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


+(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;
  }


}






objective-c