iOS
장치 버전이 3.1.3
내가 시도한 것 보다 큰지 확인하고 싶습니다.
[[UIDevice currentDevice].systemVersion floatValue]
하지만 작동하지 않습니다.
if (version > 3.1.3) { }
어떻게하면 되나요?
답변
빠른 답변…
Swift 2.0부터는 특정 시스템에서만 실행되는 코드를 보호하기 위해 또는 #available
에서 사용할 수 있습니다 .if
guard
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
}
CLLocationManager
and과 같은 일부 클래스는 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
이전 시스템을 대상으로 프로젝트를 사용할 수 있습니다 systemVersion
에 UIDevice
. 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
}
이것은 respondsToSelector
etc ( 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.NumericSearch
on 과 비교를 사용하십시오
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;
}