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

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


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.