ios - সুইফটে ওএস সংস্করণ চেক?




macos swift (13)

সুইফ্ট 3.0

ProcessInfo আমাদের সংস্করণ তথ্য দেয় যেহেতু আমরা এক্সটেনশান তৈরি করতে হবে না। আপনি নীচের আইওএস জন্য নমুনা কোড দেখতে পারেন।

let os = ProcessInfo().operatingSystemVersion
switch (os.majorVersion, os.minorVersion, os.patchVersion) {
case (8, 0, _):
    print("iOS >= 8.0.0, < 8.1.0")
case (8, _, _):
    print("iOS >= 8.1.0, < 9.0")
case (9, _, _):
    print("iOS >= 9.0.0")
default:
    // this code will have already crashed on iOS 7, so >= iOS 10.0
    println("iOS >= 10.0.0")
}

রেফারেন্স: http://nshipster.com/swift-system-version-checking/

আমি সুইফ্ট সিস্টেম সিস্টেম চেক করার চেষ্টা করছি। আমি বুঝলাম, এটি কোড দ্বারা অর্জন করা যেতে পারে:

var sysData:CMutablePointer<utsname> = nil
let retVal:CInt = uname(sysData)

আমি এই কোড দিয়ে দুটি সমস্যা আছে:

  1. সিএসডিটা এর প্রাথমিক মান কী হওয়া উচিত? এই উদাহরণটি সম্ভবত retval- এ 1 টি কারণ sysData nil।
  2. আমি কিভাবে sysData থেকে তথ্য পড়তে পারি?

সুইফ্ট 4

func run() {
    let version = OperatingSystemVersion(majorVersion: 11, minorVersion: 0, patchVersion: 0)
    if ProcessInfo.processInfo.isOperatingSystemAtLeast(version) {
        runNewCode()
    } else {
        runLegacyCode()
    }
}

func runNewCode() {
    guard #available(iOS 11.0, *) else {
        fatalError()
    }
    // do new stuff
}

func runLegacyCode() {
    // do old stuff
}

IOS এর জন্য, চেষ্টা করুন:

var systemVersion = UIDevice.current.systemVersion

ওএস এক্স এর জন্য, চেষ্টা করুন:

var systemVersion = NSProcessInfo.processInfo().operatingSystemVersion

ব্যবহারকারীরা যদি কমপক্ষে একটি নির্দিষ্ট সংস্করণটি চালাচ্ছেন কিনা তা যাচাই করতে চান তবে আপনি iOS এবং OS X এ কাজ করে নিম্নলিখিত সুইফ্ট 2 বৈশিষ্ট্যটি ব্যবহার করতে পারেন:

if #available(iOS 9.0, *) {
    // use the feature only available in iOS 9
    // for ex. UIStackView
} else {
    // or use some work around
}

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

if (self.respondsToSelector(Selector("showViewController"))) {
    self.showViewController(vc, sender: self)
} else {
    // some work around
}

আমি নীচের লিঙ্কে তাত্ক্ষণিকভাবে স্থানান্তরিত হেলপার ফাংশন তৈরি করেছি:

কিভাবে আমরা প্রোগ্রামটি আইটিএস সংস্করণ চলমান ডিভাইস সনাক্ত করতে পারেন?

func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(version,
        options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedSame
}

func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(version,
        options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedDescending
}

func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(version,
        options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending
}

func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(version,
        options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending
}

func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(version,
        options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedDescending
}

এটি তাই ব্যবহার করা যেতে পারে:

SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO("7.0")

সুইফট 4.2

func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == .orderedSame
}

func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == .orderedDescending
}

func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) != .orderedAscending
}

func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == .orderedAscending
}

func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) != .orderedDescending
}

এখানে লিখিত নমুনা কোডগুলি অতিরিক্ত শূন্য সংস্করণের সাথে অপ্রত্যাশিত ফলাফল পাবে। উদাহরণ স্বরূপ,

func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending
}

এই পদ্ধতিটি "10.3" iOS তে গৃহীত সংস্করণ "10.3.0" এর সাথে সত্য ফিরে আসবে না। এই ধরনের ফলাফল জ্ঞান করে না এবং তাদেরকে একই সংস্করণ হিসাবে বিবেচনা করা উচিত। সঠিক তুলনা ফলাফল পেতে, আমরা সংস্করণ স্ট্রিং মধ্যে সংখ্যা উপাদান সব তুলনা বিবেচনা করা আবশ্যক। প্লাস, সমস্ত মূলধন অক্ষরে বিশ্বব্যাপী পদ্ধতি প্রদান করা একটি ভাল উপায় নয়। সংস্করণ টাইপ হিসাবে আমরা আমাদের এসডিকে একটি স্ট্রিং ব্যবহার করি, এটি স্ট্রিংয়ের তুলনামূলক কার্যকারিতা সম্প্রসারিত করে তোলে।

সিস্টেম সংস্করণ তুলনা করার জন্য, নিম্নলিখিত সমস্ত উদাহরণ কাজ করা উচিত।

XCTAssertTrue(UIDevice.current.systemVersion.isVersion(lessThan: "99.0.0"))
XCTAssertTrue(UIDevice.current.systemVersion.isVersion(equalTo: UIDevice.current.systemVersion))
XCTAssertTrue(UIDevice.current.systemVersion.isVersion(greaterThan: "3.5.99"))
XCTAssertTrue(UIDevice.current.systemVersion.isVersion(lessThanOrEqualTo: "10.3.0.0.0.0.0.0"))
XCTAssertTrue(UIDevice.current.systemVersion.isVersion(greaterThanOrEqualTo: "10.3"))

আপনি এখানে আমার সংগ্রহস্থলে এটি পরীক্ষা করতে পারেন https://github.com/DragonCherry/VersionCompare


এছাড়াও আপনি WatchOS চেক করতে চান।

দ্রুতগতি

let watchOSVersion = WKInterfaceDevice.currentDevice().systemVersion
print("WatchOS version: \(watchOSVersion)")

উদ্দেশ্য গ

NSString *watchOSVersion = [[WKInterfaceDevice currentDevice] systemVersion];
NSLog(@"WatchOS version: %@", watchOSVersion);

ম্যাট থম্পসন একটি খুব সহজ উপায় শেয়ার

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

ম্যাট থম্পসনের উত্তরের উপর ভিত্তি করে, এখানে আইফোন 7 এবং তার উপরে আইফোনটি সিফ্ট এবং উদ্দেশ্য-সি এর সাথে সম্পর্কিত সম্পর্কিত ইউনিট পরীক্ষাগুলির সাথে একটি পদ্ধতি রয়েছে ( আইওএস 9 সহ যা আপনাকে আর NSFoundationNumber চেক করবে না ):

+ (BOOL) isAtLeastOSVersion:(NSString *)osVersion
{
    switch ([[UIDevice currentDevice].systemVersion compare:osVersion options:NSNumericSearch]) {
        case NSOrderedSame:
        case NSOrderedDescending:
            return YES;
        default:
            return NO;
    }
}  

@interface ANFakeCurrDevice : NSObject
@property (nonatomic, strong) NSString *systemVersion;
@end
@implementation ANFakeCurrDevice
@end


@implementation MyHelperClassUnitTests

- (void)setUp {
    [super setUp];
}

- (void)tearDown {
    [super tearDown];
}

- (void)test_isAtLeastOSVersion
{
    id deviceMock = [OCMockObject niceMockForClass:[UIDevice class]];
    ANFakeCurrDevice *fakeCurrDevice = [ANFakeCurrDevice new];
    fakeCurrDevice.systemVersion = @"99.9.9";
    [[[deviceMock stub] andReturn:fakeCurrDevice] currentDevice];
    XCTAssertTrue([[UIDevice currentDevice].systemVersion isEqualToString:@"99.9.9"]);

    fakeCurrDevice.systemVersion = @"1.0.1";
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1"]);
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1.0"]);
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"1.0.1"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"1.0.2"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"1.1.0"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0.0"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.0.1"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"2.1.0"]);


    fakeCurrDevice.systemVersion = @"8.4.0";
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"7.0.1"]);
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8"]);
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"8.4.1"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"8.4.2"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0.1"]);
    XCTAssertFalse([ANConstants isAtLeastOSVersion:@"9.0.2"]);
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"] && ![ANConstants isAtLeastOSVersion:@"9.0"]);

    fakeCurrDevice.systemVersion = @"8.4.1";
    XCTAssertTrue([ANConstants isAtLeastOSVersion:@"8.4"] && ![ANConstants isAtLeastOSVersion:@"9.0"]);
}


@end

সুইফ্ট 2 এবং তারপরে সিস্টেম সংস্করণ (এবং অনেকগুলি সংস্করণ) পরীক্ষা করার সবচেয়ে সহজ এবং সহজ উপায় হল:

if #available(iOS 9.0, *) { // check for iOS 9.0 and later

}

এছাড়াও, # উপলব্ধ সাথে আপনি এই সংস্করণ চেক করতে পারেন:

iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift

সুইফ্ট 3.0+ জন্য আপডেট করুন

func SYSTEM_VERSION_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == ComparisonResult.orderedSame
}

func SYSTEM_VERSION_GREATER_THAN(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == ComparisonResult.orderedDescending
}

func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedAscending
}

func SYSTEM_VERSION_LESS_THAN(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) == ComparisonResult.orderedAscending
}

func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(version: String) -> Bool {
    return UIDevice.current.systemVersion.compare(version, options: .numeric) != ComparisonResult.orderedDescending
}

সিস্টেমের বর্তমান সংস্করণ পান এবং এটি বিভক্ত। সুতরাং আপনি প্রধান এবং ছোট সংস্করণ পেতে পারেন।

let sys_version = UIDevice.current.systemVersion
let all_version = sys_version.components(separatedBy: ".")
print("Major version : \(all_version[0])")
print("Minor version : \(all_version[1])")

হালনাগাদ:
এখন আপনি সুইফ্ট 2 দিয়ে প্রবর্তিত নতুন উপলব্ধতা পরীক্ষা ব্যবহার করা উচিত:
উদাহরণস্বরূপ, কম্পাইল সময় iOS 9.0 বা তারপরে পরীক্ষা করার জন্য এটি ব্যবহার করুন:

if #available(iOS 9.0, *) {
    // use UIStackView
} else {
    // show sad face emoji
}

অথবা পুরো পদ্ধতি বা ক্লাস সঙ্গে ব্যবহার করা যেতে পারে

@available(iOS 9.0, *)
func useStackView() {
    // use UIStackView
}

আরো তথ্যের জন্য hackingwithswift.com/new-syntax-swift-2-availability-checking

রান সময় চেক করুন:

যদি আপনি সঠিক সংস্করণটি চান না তবে iOS 9,10 বা 11 টি চেক করে দেখতে চান তবে:

let floatVersion = (UIDevice.current.systemVersion as NSString).floatValue

সম্পাদনা করুন: এটি অর্জনের আরেকটি উপায় পাওয়া গেছে:

let iOS8 = floor(NSFoundationVersionNumber) > floor(NSFoundationVersionNumber_iOS_7_1)
let iOS7 = floor(NSFoundationVersionNumber) <= floor(NSFoundationVersionNumber_iOS_7_1)

let osVersion = NSProcessInfo.processInfo().operatingSystemVersion
let versionString = osVersion.majorVersion.description + "." + osVersion.minorVersion.description + "." + osVersion.patchVersion.description
print(versionString)




swift