iOS 버전을 확인하는 방법?


848

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

[[UIDevice currentDevice].systemVersion floatValue]

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

if (version > 3.1.3) { }

어떻게하면 되나요?


5
사회자 주 : 시간이 지남에 따라이 질문에 대한 답변이 30 개를 넘었습니다. 새로운 답변을 추가하기 전에 솔루션이 제공되지 않았 는지 확인하십시오 .
— Matt

3
if #available(iOS 9, *) {}Swift에서 Xcode 7 시작 if (@available(iOS 11, *)) {}objective-c에서 Xcode 9 시작
— Cœur

답변:


1002

빠른 답변…


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

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


161
시스템 버전 확인이 필요한 특정한 경우가 있습니다. 예를 들어 비공개 n 3.x 인 두 개의 클래스와 메서드는 4.0에서 공개되었으므로 가용성을 간단히 확인하면 3.x에서 잘못된 결과를 얻게됩니다. 또한 UIScrollViews가 3.2 이상에서 미세하게 변경된 줌 배율을 처리하는 방식이므로 결과를 적절하게 처리하려면 OS 버전을 확인해야합니다.
— Brad Larson

2
아이폰 OS 3.2 보낼 표시되지 않습니다 -viewWillAppearA의 UISplitViewController. 내 해킹은 <iOS 4.0인지 확인하고 루트보기에서 Detail View Controller로 직접 보냅니다 -didSelectRowAtIndexPath.
— jww

10
[@"10.0" compare:@"10" options:NSNumericSearch]returns 이기 때문에 약간의주의가 필요 NSOrderedDescending합니다. (나는 기대할 수 있습니다 NSOrderedSame.) 이것은 이론적으로 가능한 가능성입니다.
— SK9

그렇습니다 .iOS 5 버그를 우회 해야하는 경우가 있습니다. respondsToSelectoret al은 일을하지 않을 것입니다-버전을 비교해야합니다.
— 핫 릭

2
TVos의 도입으로 이것은 더욱 중요해졌습니다. 9.1 SDK가 사용되는 동안 TVos는 9.0을 반환합니다. 따라서 클래스 또는 메소드 (선택기)가 가장 좋은 방법 NSFoundationVersionNumber인지 확인하십시오.이 후에 는 시스템 버전을 확인 해야하는 경우가 아닌 경우에만 확인해야합니다 UIDevice.
— rckoenes

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

20
+1. 필요한 곳에 포함 할 수있는 헤더에 이것을 유지하는 것이 내가 생각할 수있는 가장 쉬운 솔루션입니다. 여러 경우에 NSClassFromString을 사용하여 가용성을 확인하는 것보다 더 안정적입니다. 또 다른 예는 iAd에 있으며 4.2 이전 버전에서 ADBannerContentSizeIdentifierPortrait를 사용하면 EXEC_BAD_ACCESS가 표시되지만 4.1 이후에는 동등한 ADBannerContentSizeIdentifier320x50이 사용되지 않습니다.
— Rab

1
내가 사용하는 또 다른 장소는 UIPageViewController를 사용하고 iOS6에서 스타일을 UIPageViewControllerTransitionStyleScroll로 설정하는 것입니다.
— Paul de Lange

7
이것은 10 대 동안 작동하지 않습니다. 예를 들어 4.10과 4.9를 비교하면 잘못된 결과가 나타납니다.
— pzulw

7
선택적 .0숫자를 사용할 때는 매우주의해야합니다 . 예를 들어 SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")iOS 7.0에서 잘못된 결과를 제공합니다.
— 얀

1
방금 이것을 .pch 파일에 넣는 것을 테스트했으며 훌륭하게 작동합니다 (최소한 Xcode 5로 빌드)
— whyoz

253

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

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

40
+1 이것은 가장 안전 하고 정확한 옵션입니다.
— mxcl

8
Um .. NSFoundationVersionNumber_iOS_6_1는 iOS 5 SDK에 없습니다.
— Kjuly

2
@Kjuly 당신은 당신 자신에 의해 누락 된 버전 번호를 정의 할 수 있습니다 : github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h (102-130 행을보십시오)
— CarlJ

3
아니요, 잘못되었습니다. NSFoundationVersionNumber_iOS_7_0이 (가) 없습니다. 그러나 우리는로 정의 할 수 있습니다 #ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif. 그런 혼란을 피하기 위해 yasirmturk의 SYSTEM_VERSION_LESS_THAN (v) 매크로를 사용했습니다
— Cœur

7
아니,하지만 애플은 추가됩니다 NSFoundationVersionNumber_iOS_8_0단지에 대한 확인 아이폰 OS 9에서 NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
— CarlJ

111

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
}

선적 서류 비치


Objective-C 또는 Swift에서 어떻게 이것을 뒤집을 수 있습니까?
— Legoless

@Legolessif (...) {} else { ... }
— Cœur

guard블록을 열어두고 들여 쓰기하는 대신 Objective-C에서 사용할 수 있습니까 else?
— Legoless

@Legoless 아니요, 빈 if블록 다음에을 사용 하십시오 else.
— Cœur

1
그것이 현재 가지고있는 솔루션 if입니다. 불필요한 들여 쓰기와 빈 블록 을 피하고 싶었습니다 .
— Legoless

45

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
}

37

시험:

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
}

2
@ "3.1.3"과 systemVersion이 모두 NSString이므로 여기서 순서를 바꾸고 비교를 저장하지 않는 이유는 무엇입니까? 예 :`if ([@ "3.1.3"비교 : [UIDevice currentDevice] .systemVersion 옵션 : NSNumericSearch] == NSOrderedDescending); // OS 버전> = 3.1.3 else; // OS 버전 <3.1.3`
— Rob

3
그렇게하면 논리가 덜 명확해질 수 있습니다. 그러나 작업은 동일해야합니다.
— Jonathan Grynspan 8:13에

1
두 정수 사이의 비교는 확실히 비싸지 않습니다.
— KPM

정말 스타일의 문제입니다. 메시지 디스패치의 오버 헤드는 여분의 정수 비교보다 훨씬 큽니다.
— Jonathan Grynspan

35

선호하는 접근법

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 에서 더 많은 것을 읽으 십시오 .


9

나는 항상 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)

큰. 이것을 .pchXCode 프로젝트 파일에 배치하는 것이
— 좋습니다

1
내 Constants.h파일로 가져온 모든 상수를 파일 에 배치 pch합니다.
— Segev

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


}

@Jef 기간은 버전 관리에서 소수점이 아니며 관련성이 있습니다. 당신의 대답은 마침표를 무시하지 않으며, 그렇지 않으면 실패 할 것입니다. 버전 관리에서 각 기간으로 구분 된 요소는 정수입니다. 예 : 두 번째 요소 '23'이 '2'보다 크기 때문에 '1.23.45'가 '1.2.345'보다 큽니다. 마침표를 제거하면 같은 숫자가됩니다.
— Andres Canella

6

nv-ios-version 프로젝트 (Apache License, 버전 2.0)에 포함 된 Version 클래스를 사용하면 iOS 버전을 쉽게 찾아 비교할 수 있습니다. 아래의 예제 코드는 iOS 버전을 덤프하고 버전이 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
TakahikoKawasaki / nv-ios-version

블로그 : 런타임시 iOS 버전을 Version 클래스로 가져 오기 및 비교 런타임시 iOS 버전을 Version 클래스로 가져
오기 및 비교


5

신속한 Forget [[UIDevice currentDevice] systemVersion] 및 NSFoundationVersionNumber를 사용하여 시스템 버전을 확인하는 새로운 방법.

NSProcessInfo -isOperatingSystemAtLeastVersion을 사용할 수 있습니다

     import Foundation

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

5

UIDevice + IOSVersion.h

@interface UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion;
+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion

@end

UIDevice + IOSVersion.m

#import "UIDevice+IOSVersion.h"

@implementation UIDevice (IOSVersion)

+ (BOOL)isCurrentIOSVersionEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedSame;
}

+ (BOOL)isCurrentIOSVersionGreaterThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedDescending;
}

+ (BOOL)isCurrentIOSVersionGreaterThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] == NSOrderedAscending;
}

+ (BOOL)isCurrentIOSVersionLessThanOrEqualToVersion:(NSString *)iOSVersion
{
    return [[[UIDevice currentDevice] systemVersion] compare:iOSVersion options:NSNumericSearch] != NSOrderedDescending;
}

@end

4

일반적으로 객체가 있어야하는지 여부를 결정하기 위해 버전 번호를 확인하는 대신 객체가 주어진 선택기를 수행 할 수 있는지 묻는 것이 좋습니다.

이것이 옵션이 아닌 경우 전혀 의도하지 않은 [@"5.0" compare:@"5" options:NSNumericSearch]리턴 NSOrderedDescending이 있기 때문에 여기에서 약간주의해야 합니다. 나는 NSOrderedSame여기에 기대할 수 있습니다. 이것은 적어도 이론적 인 관심사이며, 제 의견으로는 방어 할 가치가 있습니다.

또한 합리적으로 비교할 수없는 잘못된 버전 입력의 가능성도 고려해야합니다. 애플은 세 개의 미리 정의 된 상수를 공급 NSOrderedAscending, NSOrderedSame그리고 NSOrderedDescending하지만 난라는 어떤 것을 위해 사용 생각할 수NSOrderedUnordered 내가 두 가지 일을하지 비교할 수 나는 이것을 나타내는 값을 반환 할 경우에.

또한, 애플이 언젠가는 사전 정의 된 3 개의 상수를 확장하여 다양한 반환 값을 허용하여 비교를 != NSOrderedAscending현명 하지 못하게하는 것은 불가능 하지 않습니다.

이것으로 다음 코드를 고려하십시오.

typedef enum {kSKOrderedNotOrdered = -2, kSKOrderedAscending = -1, kSKOrderedSame = 0, kSKOrderedDescending = 1} SKComparisonResult;

@interface SKComparator : NSObject
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo;
@end

@implementation SKComparator
+ (SKComparisonResult)comparePointSeparatedVersionNumber:(NSString *)vOne withPointSeparatedVersionNumber:(NSString *)vTwo {
  if (!vOne || !vTwo || [vOne length] < 1 || [vTwo length] < 1 || [vOne rangeOfString:@".."].location != NSNotFound ||
    [vTwo rangeOfString:@".."].location != NSNotFound) {
    return SKOrderedNotOrdered;
  }
  NSCharacterSet *numericalCharSet = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"];
  NSString *vOneTrimmed = [vOne stringByTrimmingCharactersInSet:numericalCharSet];
  NSString *vTwoTrimmed = [vTwo stringByTrimmingCharactersInSet:numericalCharSet];
  if ([vOneTrimmed length] > 0 || [vTwoTrimmed length] > 0) {
    return SKOrderedNotOrdered;
  }
  NSArray *vOneArray = [vOne componentsSeparatedByString:@"."];
  NSArray *vTwoArray = [vTwo componentsSeparatedByString:@"."];
  for (NSUInteger i = 0; i < MIN([vOneArray count], [vTwoArray count]); i++) {
    NSInteger vOneInt = [[vOneArray objectAtIndex:i] intValue];
    NSInteger vTwoInt = [[vTwoArray objectAtIndex:i] intValue];
    if (vOneInt > vTwoInt) {
      return kSKOrderedDescending;
    } else if (vOneInt < vTwoInt) {
      return kSKOrderedAscending;
    }
  }
  if ([vOneArray count] > [vTwoArray count]) {
    for (NSUInteger i = [vTwoArray count]; i < [vOneArray count]; i++) {
      if ([[vOneArray objectAtIndex:i] intValue] > 0) {
        return kSKOrderedDescending;
      }
    }
  } else if ([vOneArray count] < [vTwoArray count]) {
    for (NSUInteger i = [vOneArray count]; i < [vTwoArray count]; i++) {
      if ([[vTwoArray objectAtIndex:i] intValue] > 0) {
        return kSKOrderedAscending;
      }
    }
  }
  return kSKOrderedSame;
}
@end

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

물론, NSFoundationVersionNumber_iOS_6_1확인하려는 iOS 버전에 해당하는 것으로 변경해야합니다. 내가 작성한 것은 아마도 iOS7 또는 이전 버전을 실행하는 장치인지 테스트 할 때 많이 사용될 것입니다.


4

파티에 약간 늦었지만 iOS 8.0에 비추어 볼 때 이것은 관련이있을 수 있습니다.

사용을 피할 수 있다면

[[UIDevice currentDevice] systemVersion]

대신 메소드 / 클래스 / 다른 것이 있는지 확인하십시오.

if ([self.yourClassInstance respondsToSelector:@selector(<yourMethod>)]) 
{ 
    //do stuff 
}

iOS 8.0의 requestWhenInUseAuthorization을 호출 해야하는 위치 관리자에 유용하지만 iOS <8에서는 메소드를 사용할 수 없습니다.


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

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

3

나는 이것이 오래된 질문이라는 것을 알고 있지만 누군가 컴파일 타임 매크로를 언급해야합니다 Availability.h. 여기에있는 다른 모든 방법은 런타임 솔루션이며 헤더 파일, 클래스 범주 또는 ivar 정의에서는 작동하지 않습니다.

이러한 상황에서는

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

H는 / T 이 대답을


3
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

그런 다음 다음과 같이 if 조건을 추가하십시오.

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"10.0")) {
   //Your code
}       

2

7.0 또는 6.0.3과 같은 버전이 있으므로 간단히 버전을 숫자로 변환하여 비교할 수 있습니다. 버전이 7.0과 같으면 다른 ".0"을 추가 한 다음 숫자 값을 사용하십시오.

 int version;
 NSString* iosVersion=[[UIDevice currentDevice] systemVersion];
 NSArray* components=[iosVersion componentsSeparatedByString:@"."];
 if ([components count]==2) {
    iosVersion=[NSString stringWithFormat:@"%@.0",iosVersion];

 }
 iosVersion=[iosVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
 version=[iosVersion integerValue];

6.0.0의 경우

  if (version==600) {
    // Do something
  }

7.0

 if (version==700) {
   // Do something
 }

단순히 소수점을 제거하는 것은 잘못된 접근법입니다. 길이가 1자를 초과하는 구성 요소를 고려하십시오 (예 :) 6.1.10. 이 알고리즘은를 산출 6110 > 700하지만 이는 올바르지 않습니다.
— ardnew

나는 애플이 새로운 버전을 출시하는 데 좋지 않다는 것을 알고 있지만 대부분의 경우 버전의 두 번째 숫자는 5를 넘지 않았으므로 10은 의심의 여지가 없습니다. 이것은 임시 접근 방식이므로 2 개의 구성 요소에 대한 사례를 처리하는 경우 수동으로 수행하려는 경우 4 개의 사례를 처리하도록 수정할 수 있습니다. 어쨌든이 접근법은 iOS6 또는 7시에 주석 처리되었습니다 .iOS 9 및 10에는 #available과 같은 더 나은 방법이 있습니다.
— NaXir

2

아래 코드를 사용해보십시오 :

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


1

yasimturks 솔루션의 변형으로 5 개의 매크로 대신 하나의 함수와 몇 개의 열거 형 값을 정의했습니다. 나는 그것을 더 우아하게 생각하지만 그것은 맛의 문제입니다.

용법:

if (systemVersion(LessThan, @"5.0")) ...

.h 파일 :

typedef enum {
  LessThan,
  LessOrEqual,
  Equal,
  GreaterOrEqual,
  GreaterThan,
  NotEqual
} Comparison;

BOOL systemVersion(Comparison test, NSString* version);

.m 파일 :

BOOL systemVersion(Comparison test, NSString* version) {
  NSComparisonResult result = [[[UIDevice currentDevice] systemVersion] compare: version options: NSNumericSearch];
  switch (test) {
    case LessThan:       return result == NSOrderedAscending;
    case LessOrEqual:    return result != NSOrderedDescending;
    case Equal:          return result == NSOrderedSame;
    case GreaterOrEqual: return result != NSOrderedAscending;
    case GreaterThan:    return result == NSOrderedDescending;
    case NotEqual:       return result != NSOrderedSame;
  }
}

이름, 특히 Comparison유형에 앱의 접두사를 추가해야합니다 .


1

참조 된 권장 방법을 사용하여 ... 헤더 파일에 정의가 없으면 원하는 IOS 버전의 장치를 사용하여 콘솔에서 버전을 항상 인쇄 할 수 있습니다.

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

1

Swift에서 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 버전 번호를 확인하는 것은 나쁜 습관입니다. 이러한 방식으로 종속성을 하드 코딩해서는 안되며 항상 기능, 기능 또는 클래스의 존재 여부를 확인하십시오. 이걸 고려하세요; Apple은 이전 버전과 호환되는 클래스 버전을 출시 할 수 있습니다. 그렇다면 클래스가 존재하지 않는 논리가 OS 버전 번호를 찾기 때문에 사용하지 않는 것이 좋습니다.

( 이 정보의 출처 )

Swift에서 클래스 존재를 확인하기위한 솔루션

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

if (NSClassFromString("UIAlertController") == nil)iOS 7.1 및 8.2를 사용하는 iOS 시뮬레이터에서는 올바르게 작동 하기 때문에 사용하지 않지만 iOS 7.1을 사용하여 실제 장치에서 테스트하는 경우 불행히도 코드 스 니펫의 다른 부분을 절대 통과하지 않습니다.


왜 투표를하지 않습니까? 이 솔루션은 Swift 및 모든 iOS 버전을 사용하여 완벽하게 작동합니다. 특히 클래스 존재를 확인하는 것은 완벽합니다.
— King-Wizard

1
#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

0

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


0
float deviceOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
float versionToBeCompared = 3.1.3; //(For Example in your case)

if(deviceOSVersion < versionToBeCompared)
   //Do whatever you need to do. Device version is lesser than 3.1.3(in your case)
else 
   //Device version should be either equal to the version you specified or above

float versionToBeCompared = 3.1.3;컴파일조차 할 수 없습니다.
— Pang

0

실제로 작동하는 신속한 예 :

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 년까지는 거의 쓸모가 없습니다.


0

빠른 버전은 다음과 같습니다.

struct iOSVersion {
    static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue
    static let iOS7 = (Version.SYS_VERSION_FLOAT < 8.0 && Version.SYS_VERSION_FLOAT >= 7.0)
    static let iOS8 = (Version.SYS_VERSION_FLOAT >= 8.0 && Version.SYS_VERSION_FLOAT < 9.0)
    static let iOS9 = (Version.SYS_VERSION_FLOAT >= 9.0 && Version.SYS_VERSION_FLOAT < 10.0)
}

용법:

if iOSVersion.iOS8 {
    //Do iOS8 code here
}

저는 Version이 3-6 행의 iOSVersion이어야한다고 생각합니다 struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }
— Kastor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.