iOSのバージョンを確認する方法は?


848

iOSデバイスのバージョンが、3.1.3 私が試したものよりも新しいかどうかを確認したいと思います。

[[UIDevice currentDevice].systemVersion floatValue]

しかし、それは動作しません、私はただ欲しい:

if (version > 3.1.3) { }

どうすればこれを達成できますか?


5
モデレーターのメモ:時間の経過とともに、この質問には30以上の回答が蓄積されています。新しい回答を追加する前に、ソリューションがまだ提供されていないことを確認してください。
マット

3
if #available(iOS 9, *) {}SwiftでのXcode 7の開始。Xcode 9以降if (@available(iOS 11, *)) {}、objective-cで。
・クール

これを確認してくださいgithub.com/aleemrazzaq/ARCompactDeviceInfo
Aleem

回答:


1002

簡単な答え…


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およびなどの一部のクラスは、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
システムバージョンのチェックが保証される特定のケースがあります。たとえば、private n 3.xであったいくつかのクラスとメソッドは4.0で公開されたので、それらの可用性を単に確認しただけでは、3.xで誤った結果が得られます。さらに、UIScrollViewsがズームスケールを処理する方法が3.2以降で微妙に変更されたため、結果を適切に処理するためにOSバージョンを確認する必要があります。
ブラッド・ラーソン

2
iOSの3.2には、送信するためには表示されません-viewWillAppearUISplitViewController。私のハックは、<iOS 4.0かどうかを判断し、ルートビューので自分自身を詳細ビューコントローラーに送信すること-didSelectRowAtIndexPathです。
jww

10
は意図したものではない可能性があるを[@"10.0" compare:@"10" options:NSNumericSearch]返すためNSOrderedDescending、ここでは少し注意する必要があります。(私は期待するかもしれませんNSOrderedSame。)これは少なくとも理論的な可能性です。
SK9

はい、iOS 5のバグを回避する必要がある場合に遭遇しました。 respondsToSelector他の人は仕事をしません-バージョンを比較する必要があります。
Hot Licks 2013年

2
TVosの導入により、これはさらに重要になっています。9.1 SDKが使用されている場合、TVosは9.0を返します。したがって、クラスまたはメソッド(セレクタ)を確認するのが最善の方法です。この後、を確認するNSFoundationVersionNumber必要がありますUIDevice。それが不可能な場合のみ、のシステムバージョンを確認してください。
rckoenes 2015年

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が取得されますが、同等のADBannerContentSizeIdentifier320x50は4.1以降非推奨です。
Rab

1
私がこれを使用するもう1つの場所は、UIPageViewControllerを使用し、iOS6でスタイルをUIPageViewControllerTransitionStyleScrollに設定することです。
Paul de Lange

7
これは10秒間は機能しません。たとえば、4.10と4.9を比較すると、間違った結果になります。
pzulw 2013

7
オプションの.0数値を使用する場合は、注意が必要です。たとえばSYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")、iOS 7.0では正しくない結果が得られます。
Yan

1
これを.pchファイルに入れてテストしたところ、(少なくともXcode 5でビルドして)
うまく機能しました

253

公式のAppleドキュメントで提案されているようにNSFoundationVersionNumberNSObjCRuntime.hヘッダーファイルからを使用できます。

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

40
+1これは実際、ここで最も安全で最も正確なオプションです。
mxcl

8
ええとNSFoundationVersionNumber_iOS_6_1、iOS 5 SDKには存在しません。
Kjuly 2013

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。そのようにいじり避けるために、私はSYSTEM_VERSION_LESS_THAN(V)yasirmturkからマクロを一緒に行きました
・クール

7
いいえ、NSFoundationVersionNumber_iOS_8_0NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
でもApple

111

Objective-CでのXcode 9の開始:

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

Xcode 7を起動し、Swiftで

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

バージョンについては、MAJOR、MINOR、またはPATCHを指定できます(定義については、http: //semver.org/を参照してください)。例:

  • iOS 11iOS 11.0同じ最小バージョンです
  • iOS 10iOS 10.3iOS 10.3.1さまざまな最小限のバージョンです

これらのシステムの値を入力できます。

  • iOSmacOSwatchOStvOS

私のポッドの1つから取られた実際のケースの例:

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 '19

@Legolessif (...) {} else { ... }
・クール

ステートメントをguardブロックのままにしてインデントする代わりに、Objective-Cで使用できますelseか?
Legoless '19

@Legolessいいえ、空のifブロックの後にelse
・クール

1
それは私が現在持っている解決策ですが、不必要なインデントと空のifブロックを避けたいだけです。
Legoless '19

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
}

Swiftバージョン:

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`
ロブ

3
これを行うと、ロジックが不明確になる可能性があります。ただし、操作は同等である必要があります。
ジョナサングリンスパン

1
2つの整数を比較しても、コストはそれほど高くありません。
KPM

それは本当にスタイルの問題です。メッセージディスパッチのオーバーヘッドは、余分な整数の比較を大幅に上回ります。
ジョナサン・グリンスパン2012

35

推奨されるアプローチ

Swift 2.0では、Appleははるかに便利な構文を使用して可用性チェックを追加しました(詳細はこちら)。これで、より明確な構文でOSバージョンを確認できます。

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

これは、チェックrespondsToSelectorなどよりも推奨されます(Swiftの新機能)。コードを適切に保護していない場合、コンパイラーは常に警告を表示します。


Pre Swift 2.0

iOS 8の新機能NSProcessInfoにより、セマンティックバージョン管理チェックが改善されました。

iOS 8以降へのデプロイ

iOS 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以下の最小展開ターゲットについては、compare with 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プロジェクトのファイルに配置することをお勧めします
Vaibhav Jhaveri 2015

1
すべての定数をConstants.hファイルにインポートし、pchファイルにインポートします。
セゲフ2015

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ピリオドは、バージョン管理では小数点ではなく、関連があります。あなたの答えはピリオドを無視しません、もしそうなら失敗します。バージョン管理では、ピリオドで区切られた各要素は整数です。例:2番目の要素「23」が「2」より大きいため、「1.23.45」は「1.2.345」より大きい。期間を削除すると、同じ数になります。
Andres Canella

6

バージョンに含まれているクラスNV-IOS-バージョンのプロジェクト(Apacheライセンス、バージョン2.0)、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

ブログ:実行時にVersionクラスを使用してiOSバージョンを取得および比較する実行時にVersionクラス
を使用してiOSバージョンを取得および比較する


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ここで期待するかもしれません。これは少なくとも理論的な懸念であり、私の意見では防御する価値があります。

また、合理的に比較することができない不良バージョンの入力の可能性も考慮する価値があります。Appleは3つの定義済みの定数を提供しNSOrderedAscendingNSOrderedSameそしてNSOrderedDescending私はと呼ばれるいくつかのことのために使用を考えることができNSOrderedUnordered、私は二つのことを比較することはできませんし、私はこれを示す値を返したい場合に。

さらに、Appleがいつか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

Appleは新しいバージョンのロールアウトが苦手だと思いますが、ほとんどの場合、バージョンの2番目の数は5を超えることはないため、10は問題外です。これはアドホックアプローチであるため、2つのコンポーネントのケースを処理する場合、手動で行う場合は4つのケースを処理するように変更できます。とにかく、このアプローチはiOS6または7の時点でコメントされていました。iOS9および10には、#availableをチェックするより優れた方法があります。
NaXir 2017年

2

以下のコードを試してください:

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


1

yasimturksソリューションのバリエーションとして、5つのマクロではなく、1つの関数といくつかの列挙値を定義しました。私はもっ​​とエレガントだと思いますが、それは好みの問題です。

使用法:

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を使用する実際のデバイスでテストすると、残念ながら、コードスニペットのelse部分を通過しないことに気付くでしょう。


なぜ反対投票ですか?このソリューションは、Swiftと任意のiOSバージョンを使用して完全に機能します。特にクラスの存在チェックは完璧です。
King-Wizard

1
#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

0

Obj-C ++ 11のより一般的なバージョン(おそらく、この機能の一部をNSString / C関数で置き換えることができますが、これは冗長ではありません。これにより、2つのメカニズムが提供されます。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;コンパイルすらできません。
2016

0

実際に機能するSwiftの例:

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
}

バージョンは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.