[ios] iOS 버전을 확인하는 방법?

iOS장치 버전이 3.1.3
내가 시도한 것 보다 큰지 확인하고 싶습니다.

[[UIDevice currentDevice].systemVersion floatValue]

하지만 작동하지 않습니다.

if (version > 3.1.3) { }

어떻게하면 되나요?



답변

빠른 답변…

Swift 2.0부터는 특정 시스템에서만 실행되는 코드를 보호하기 위해 또는 #available에서 사용할 수 있습니다 .ifguard

if #available(iOS 9, *) {}

Objective-C에서 시스템 버전을 확인하고 비교를 수행해야합니다.

[[NSProcessInfo processInfo] operatingSystemVersion] iOS 8 이상에서.

Xcode 9부터 :

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

전체 답변…

드문 경우이지만 Objective-C 및 Swift에서는 장치 또는 OS 기능의 표시로 운영 체제 버전에 의존하지 않는 것이 좋습니다. 일반적으로 특정 기능이나 클래스를 사용할 수 있는지 확인하는보다 안정적인 방법이 있습니다.

API가 있는지 확인 :

예를 들어 다음을 UIPopoverController사용하여 현재 장치에서 사용 가능한지 확인할 수 있습니다 NSClassFromString.

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

약하게 연결된 수업의 경우 수업에 직접 메시지를 보내는 것이 안전합니다. 특히 이것은 “필수”로 명시 적으로 링크되지 않은 프레임 워크에서 작동합니다. 누락 된 클래스의 경우 표현식은 nil로 평가되어 조건이 실패합니다.

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

CLLocationManagerand과 같은 일부 클래스는 UIDevice장치 기능을 확인하는 메소드를 제공합니다.

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

기호가 있는지 확인 :

때로는 상수가 있는지 확인해야합니다. 이는 iOS 8 UIApplicationOpenSettingsURLString에서을 통해 설정 앱을로드하는 데 사용되었습니다 -openURL:. 이 값은 iOS 8 이전에는 존재하지 않았습니다.이 API에 nil을 전달하면 충돌이 발생하므로 먼저 상수가 있는지 확인해야합니다.

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

운영 체제 버전과 비교 :

비교적 드물게 운영 체제 버전을 확인해야 할 필요가 있다고 가정 해 봅시다. iOS 8 이상을 대상으로하는 프로젝트 NSProcessInfo의 경우 오류 발생 가능성이 적은 버전 비교를 수행하는 방법이 포함되어 있습니다.

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

이전 시스템을 대상으로 프로젝트를 사용할 수 있습니다 systemVersionUIDevice. Apple은 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).


답변

/*
 *  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")) {
    ...
}


답변

에 의해 제안 된 것과 같은 공식 애플 문서 : 당신은을 사용할 수 있습니다 NSFoundationVersionNumber으로부터, NSObjCRuntime.h헤더 파일.

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


답변

Objective-C 에서 Xcode 9 시작 :

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

Swift 에서 Xcode 7 시작 :

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

버전의 경우 MAJOR, MINOR 또는 PATCH를 지정할 수 있습니다 ( 정의 는 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
}

선적 서류 비치


답변

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
}

현재 버전의 swift는 다음을 사용해야합니다.

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


답변

시험:

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
}


답변

선호하는 접근법

Swift 2.0에서 Apple은 훨씬 편리한 구문을 사용하여 가용성 검사를 추가했습니다 ( 여기에서 자세히 읽으 십시오 ). 이제 더 깔끔한 구문으로 OS 버전을 확인할 수 있습니다.

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

이것은 respondsToSelectoretc ( Swift의 새로운 기능) 를 확인하는 것보다 선호 됩니다. 이제 코드를 제대로 지키지 않으면 컴파일러에서 항상 경고합니다.


프리 스위프트 2.0

iOS 8의 새로운 기능으로 NSProcessInfo시맨틱 버전 확인이 향상되었습니다.

iOS 8 이상에 배포

최소 전개 대상의 경우 아이폰 OS 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)
}

iOS 7에 배포

iOS 7.1 이하 의 최소 ​​배포 대상의 경우 NSStringCompareOptions.NumericSearchon 과 비교를 사용하십시오
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 에서 더 많은 것을 읽으 십시오 .