स्विफ्ट में ओएस संस्करण की जाँच करें?


190

मैं स्विफ्ट में सिस्टम की जानकारी की जांच करने की कोशिश कर रहा हूं। मुझे पता चला, कि यह कोड द्वारा हासिल किया जा सकता है:

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

मुझे इस कोड में दो समस्याएं हैं:

  1. SysData का प्रारंभिक मूल्य क्या होना चाहिए? यह उदाहरण रिटवैल में -1 देता है क्योंकि शायद sysData शून्य है।
  2. मैं sysData से जानकारी कैसे पढ़ सकता हूं?

जवाबों:


387

IOS के लिए, प्रयास करें:

var systemVersion = UIDevice.current.systemVersion

OS X के लिए, प्रयास करें:

var systemVersion = NSProcessInfo.processInfo().operatingSystemVersion

यदि आप केवल यह जांचना चाहते हैं कि उपयोगकर्ता कम से कम एक विशिष्ट संस्करण चला रहे हैं, तो आप निम्न स्विफ्ट 2 सुविधा का भी उपयोग कर सकते हैं जो iOS और OS X पर काम करती है:

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

लेकिन यह ओएस संस्करण की जाँच करने के लिए अनुशंसित नहीं है। यह जांचना बेहतर है कि क्या आप जिस सुविधा का उपयोग करना चाहते हैं, वह संस्करण संख्याओं की तुलना में डिवाइस पर उपलब्ध है। IOS के लिए, जैसा कि ऊपर उल्लेख किया गया है, आपको यह जांचना चाहिए कि क्या यह चयनकर्ता के लिए प्रतिक्रिया करता है; उदा .:

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

हालांकि यह उद्देश्य ग के लिए सही है लेकिन इसे तेजी से करने का एक अच्छा तरीका है। यहाँ उल्लिखित ... hackingwithswift.com/new-syntax-swift-2-avavourcchecking
फॉगमिस्टर

2
एक उपयोग मैं ओएस संस्करण को सीधे जांचने के लिए देख सकता हूं (जैसा कि विशिष्ट क्षमताओं के लिए जांच करने का विरोध किया गया है) अपने सबसे कम तैनाती लक्ष्य को निर्धारित करने के लिए, अपने उपयोगकर्ताओं के बीच ओएस संस्करण वितरण के बारे में डेटा इकट्ठा करना है।
निकोलस मियारी

90

अपडेट:
अब आपको स्विफ्ट 2 के साथ शुरू की गई नई उपलब्धता जाँच का उपयोग करना चाहिए :
जैसे कि iOS 9.0 की जांच करना या बाद में संकलन के समय इसका उपयोग करना:

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

या पूरे विधि या वर्ग के साथ इस्तेमाल किया जा सकता है

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

अधिक जानकारी के लिए इसे देखें ।

समय की जाँच करें:

यदि आप सटीक संस्करण नहीं चाहते हैं, लेकिन यदि उपयोग कर रहे हैं तो 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)

50

मैंने सहायक कार्य किए हैं जो नीचे दिए गए लिंक से स्विफ्ट में स्थानांतरित किए गए थे:

हम प्रोग्राम का पता कैसे लगा सकते हैं कि कौन सा आईओएस संस्करण डिवाइस पर चल रहा है?

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
}

31

स्विफ्ट 5

जब ProcessInfoसे हमें संस्करण की जानकारी मिलती है, हमें एक्सटेंशन बनाने की आवश्यकता नहीं होती है । आप नीचे दिए गए iOS के लिए नमूना कोड देख सकते हैं।

let os = ProcessInfo().operatingSystemVersion

switch (os.majorVersion, os.minorVersion, os.patchVersion) {
case (let x, _, _) where x < 8:
    print("iOS < 8.0.0"

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:
    print("iOS >= 10.0.0")
}

संदर्भ: http://nshipster.com/swift-system-version-checking/


17

स्विफ्ट 5

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

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

func runLegacyCode() {
    // do old stuff
}

1
क्यों runNewCode में # उपलब्ध (iOS 11.0, *) की आवश्यकता है?
इलिया क्रिट

1
@IllyaKrit #available(...)ब्लॉक कंपाइलर को कोड के लिए त्रुटियों को प्रदर्शित करने से रोकता है जो प्रदान किए गए पुराने संस्करणों में समर्थित नहीं है।
भविष्य-एडाम

15

मैंने सरल उपयोग के लिए यह सिंगलटन बनाया , एक IOSVersion.swiftफ़ाइल बनाई और इस कोड को जोड़ा:

import UIKit

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

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

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

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

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

उपयोग :

IOSVersion.SYSTEM_VERSION_EQUAL_TO("8.0")
IOSVersion.SYSTEM_VERSION_LESS_THAN("8.0")

धन्यवाद @KVISH

स्विफ्ट 2 संपादित करें:

if #available(iOS 9.0, *) {
    // 👍 
} else {
    // 👎
}

4
क्या वह सिंगलटन है? या IOSVersion पर सिर्फ कक्षा के कार्य? एक सिंगलटन नहीं होगा static let shared = IOSVersion
चार्लटन प्रोवातस

9

यदि आप स्विफ्ट 2 का उपयोग कर रहे हैं और आप एक निश्चित एपीआई का उपयोग करने के लिए ओएस संस्करण की जांच करना चाहते हैं, तो आप नई उपलब्धता सुविधा का उपयोग कर सकते हैं:

if #available(iOS 8, *) {
    //iOS 8+ code here.
}
else {
    //Code for iOS 7 and older versions.
    //An important note: if you use #availability, Xcode will also 
    //check that you don't use anything that was introduced in iOS 8+
    //inside this `else` block. So, if you try to use UIAlertController
    //here, for instance, it won't compile. And it's great.
}

मैंने यह उत्तर इसलिए लिखा क्योंकि यह प्रश्न के लिए Google में पहला प्रश्न है swift 2 check system version


7

स्विफ्ट 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
}

1
ComparisonResultइसे छोटा करने के लिए छोड़ सकते हैं ।
जॉन पैंग

इसके अलावा, बाँटे UIDevice.current.systemVersion.compare(version, options: .numeric)एक में बाहर funcकर सकते हैं मदद कोड पढ़ने।
जॉन पैंग

5

विवरण

  • Xcode 10.2.1 (10E1001), स्विफ्ट 5

लिंक

OperatingSystemVersion

उपाय

extension OperatingSystemVersion {
    func getFullVersion(separator: String = ".") -> String {
        return "\(majorVersion)\(separator)\(minorVersion)\(separator)\(patchVersion)"
    }
}

let os = ProcessInfo().operatingSystemVersion
print(os.majorVersion)          // 12
print(os.minorVersion)          // 2
print(os.patchVersion)          // 0
print(os.getFullVersion())      // 12.2.0

1
Doubleसंस्करण संख्या के लिए उपयोग करते समय संभावित गोलाई समस्याएँ नहीं हैं , उदाहरण 10.0999के लिए 10.1?
mschmidt

नहीं var stringVersion = "10.0999"; print(stringVersion.toDouble!) // print 10.0999, यह प्रिंट होगा10.0999
वासिली बोर्नार्चुक

4
let Device = UIDevice.currentDevice()
let iosVersion = NSString(string: Device.systemVersion).doubleValue

let iOS8 = iosVersion >= 8
let iOS7 = iosVersion >= 7 && iosVersion < 8

और के रूप में जाँच करें

if(iOS8)
{

}
else 
{
}  

4

स्विफ्ट 2 और उच्चतर में सिस्टम संस्करण (और बहुत सारे अन्य संस्करण) की जांच करने का सबसे आसान और सरल तरीका है:

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

}

इसके अलावा, #availableआप इन के संस्करणों की जांच कर सकते हैं:

iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
swift

2

मैट थॉम्पसन एक बहुत ही आसान तरीका साझा करता है

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

2

स्विफ्ट 4.x

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

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

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

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

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

उपयोग:

if iOS_VERSION_GREATER_THAN_OR_EQUAL_TO(version: "11.0") {
    //Do something!
}

पीएस केविश ने स्विफ्ट 4.x के अनुवाद कार्यों का नाम बदलने के साथ अनुवाद किया क्योंकि मैं विशेष रूप से आईओएस ऐप के लिए इस स्निपेट का उपयोग कर रहा हूं।


1

नोट: iOS 8.0 और बाद में उपलब्ध। OS X v10.10 और बाद में

var majorVersion: Int    { return NSProcessInfo.processInfo().operatingSystemVersion.majorVersion }
var minorVersion: Int    { return NSProcessInfo.processInfo().operatingSystemVersion.minorVersion }
var patchVersion: Int    { return NSProcessInfo.processInfo().operatingSystemVersion.patchVersion }
var myOSVersion:  String { return NSProcessInfo.processInfo().operatingSystemVersionString        }

1

मैट थॉम्पसन के जवाब के आधार पर, यहां संबंधित इकाई परीक्षणों के साथ एक विधि है जो आईओएस 7 और इसके बाद के संस्करण पर स्विफ्ट और ऑब्जेक्टिव-सी के साथ काम करती है ( आईओएस 9 सहित) जो अब आप एनएसएफाउंडेशननंबर की जांच नहीं करते हैं :

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

आपको एहसास है कि वास्तविक तरीका बहुत छोटा और कॉम्पैक्ट है और मैंने सिर्फ उदाहरण और प्रमाण के लिए यूनिट टेस्ट कोड जोड़ा है जो यह काम करता है, है ना?
n8tr

मुझे खेद है कि मैं महसूस करने में विफल रहा कि यह एक नज़र में XCTest है।
डॉनसॉन्ग

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

0

इसके अलावा अगर आप वॉचओएस की जांच करना चाहते हैं।

तीव्र

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

उद्देश्य सी

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

0

सिस्टम का वर्तमान संस्करण प्राप्त करें और इसे विभाजित करें। तो आप प्रमुख और मामूली संस्करण प्राप्त कर सकते हैं।

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

0

यहां लिखे गए अधिकांश नमूना कोड अतिरिक्त-शून्य संस्करणों के साथ अप्रत्याशित परिणाम प्राप्त करेंगे। उदाहरण के लिए,

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

यह विधि आईओएस "10.3" में पारित संस्करण "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 पर देख सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.