web-dev-qa-db-ja.com

IOSのバージョンを確認するにはどうすればいいですか?

iOSバージョンのデバイスが3.1.3よりも大きいかどうかをチェックしたいのですが。

[[UIDevice currentDevice].systemVersion floatValue]

しかし、それはうまくいきません。

if (version > 3.1.3) { }

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

814
John

簡単な答え…


Swift 2.0では、ifまたはguard#availableを使用して、特定のシステムでのみ実行されるべきコードを保護できます。

if #available(iOS 9, *) {}


Objective-Cでは、システムのバージョンを確認して比較する必要があります。

iOS 8以降の[[NSProcessInfo processInfo] operatingSystemVersion]

Xcode 9以降:

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


完全な答え…

Objective-Cでは、まれにSwiftでは、デバイスまたはOSの機能を示すものとしてオペレーティングシステムのバージョンに依存しないようにすることをお勧めします。通常、特定の機能またはクラスが利用可能かどうかを確認するためのより信頼性の高い方法があります。

APIの存在を確認する:

たとえば、UIPopoverControllerが現在のデバイスで利用可能かどうかをNSClassFromStringを使用して確認できます。

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

弱くリンクされたクラスの場合は、直接クラスにメッセージを送るのが安全です。特に、これは "必須"として明示的にリンクされていないフレームワークに対して機能します。欠落クラスの場合、式はnilと評価され、条件が満たされません。

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

CLLocationManagerUIDeviceのようないくつかのクラスは、デバイスの機能をチェックするメソッドを提供します。

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

シンボルの存在を確認する:

ごくまれに、定数の存在を確認する必要があります。これはiOS 8でUIApplicationOpenSettingsURLStringの導入により思いつきました。これは-openURL:経由でSettingsアプリをロードするために使用されていました。値は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)。

949
Justin
/*
 *  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")) {
    ...
}
1046
yasirmturk

公式Appleドキュメント :によって示唆されているように、あなたはNSObjCRuntime.hヘッダファイルから NSFoundationVersionNumber を使うことができます。

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

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は異なる最小バージョンです

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

  • iOSname__、macOSname__、watchOSname__、tvOSname__

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

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

ドキュメンテーション

82
Cœur

これは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
}
36
Travis M.

試してください:

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

優先アプローチ

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以降へのデプロイ

iOS 8.0 以上の最小デプロイメントターゲットの場合は、NSProcessInfooperatingSystemVersionまたは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.NumericSearchUIDevice 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 でもっと読む。

34
Daniel Galasko

私はお勧め:

if ([[[UIDevice currentDevice] systemVersion] floatValue] > 3.13) {
    ; // ...
}

クレジット: 特定のiPhoneのバージョンをターゲットにする方法?

17
ohho

私は常に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)
8
Segev
+(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;
  }


}
6
Jef

nv-ios-version project(Apache License、Version 2.0)に含まれる Version classを使用すると、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
川崎貴彦/ nv-ios-version

ブログ: Versionクラスで実行時にiOSのバージョンを取得して比較する
実行時にiOSのバージョンを取得し、Versionクラスと比較する

6

Swift Forget [[UIDevice currentDevice] systemVersion]とNSFoundationVersionNumberを使ってシステムのバージョンをチェックする新しい方法。

NSProcessInfo -isOperatingSystemAtLeastVersionを使用できます。

     import Foundation

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

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
5
Oliver Pearmain
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        // Your code here
}

もちろん、NSFoundationVersionNumber_iOS_6_1は、確認したいiOSのバージョンに応じて適切なものに変更する必要があります。私が今書いたものは、おそらくデバイスがiOS7かそれ以前のバージョンを実行しているかどうかをテストするときによく使われるでしょう。

4
OscarWyck

パーティーには少し時間がかかりますが、iOS 8.0を考慮すると、これは関連性があるかもしれません。

あなたが使用を避けることができるならば

[[UIDevice currentDevice] systemVersion]

代わりに、メソッド/クラス/その他の存在を確認してください。

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

私はそれが私がiOS 8.0のためにrequestWhenInUseAuthorizationを呼ばなければならない位置マネージャにとって有用であるとわかりました、しかし、メソッドはiOS <8のために利用できません

4
Denis Kanygin

一般に、バージョン番号をチェックして存在する必要があるかどうかを判断するよりも、オブジェクトが特定のセレクターを実行できるかどうかを確認する方が適切です。

これがオプションではない場合、[@"5.0" compare:@"5" options:NSNumericSearch]NSOrderedDescendingを返すため、ここでは少し注意する必要があります。ここにNSOrderedSameが期待できます。これは少なくとも理論的な懸念であり、私の意見では防御する価値があります。

また、合理的に比較することができない悪いバージョン入力の可能性も考慮する価値があります。 Appleは、3つの定義済み定数NSOrderedAscendingNSOrderedSame、およびNSOrderedDescendingを提供しますが、NSOrderedUnorderedと呼ばれるものの使用を考えられる2つのことを比較せず、これを示す値を返します。

さらに、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
SK9
#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
}       
3
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

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

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

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

7.0や6.0.3のようなバージョンがあるので、比較するために単純にバージョンを数値に変換することができます。 versionが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
 }
2
NaXir

OSのバージョン文字列値を取得するためだけに:

[[UIDevice currentDevice] systemVersion]
#define IsIOS8 (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)
1
Gank

私はこれが古い質問であることを知っていますが、誰かが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 これ 答え

1
bcattle

参照されている推奨される方法を使用して...ヘッダファイルに定義がない場合は、いつでも希望のIOSversiónのデバイスを使ってコンソールに表示することができます。

- (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
tyoc213

Yasimturksソリューションのバリエーションとして、5つのマクロの代わりに1つの関数といくつかのenum値を定義しました。私はそれがよりエレガントだと思いますが、それは好みの問題です。

使用法:

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
jcsahnwaldt

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部分を通過しないことに気付きます。

1
King-Wizard

これを試して

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
// do some work
}
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
0
GJDK

Obj-C++ 11のより一般的なバージョン(おそらく、これらのうちのいくつかをNSString/C関数で置き換えることができますが、これはより冗長な方法です。あなたはただメジャーバージョン(例えば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
Vitali

これはSwiftバージョンです。

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
}
0
Swinny89

実際に動作する簡単な例:

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
Esqarrouth

以下のSwiftコードをプロジェクトに追加して、iOSのバージョンやデバイスなどの情報に簡単にアクセスします。

class DeviceInfo: NSObject {

    struct ScreenSize
    {
        static let SCREEN_WIDTH = UIScreen.main.bounds.size.width
        static let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
        static let SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
        static let SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    }

    struct DeviceType
    {
        static let IS_IPHONE_4_OR_LESS =  UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
        static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
        static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH >= 667.0
        static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
        static let IS_IPHONE_X = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
        static let IS_IPAD      = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0
        static let IS_IPAD_PRO  = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1366.0
    }

    struct VersionType{
        static let SYS_VERSION_FLOAT = (UIDevice.current.systemVersion as NSString).floatValue
        static let iOS7 = (VersionType.SYS_VERSION_FLOAT < 8.0 && VersionType.SYS_VERSION_FLOAT >= 7.0)
        static let iOS8 = (VersionType.SYS_VERSION_FLOAT >= 8.0 && VersionType.SYS_VERSION_FLOAT < 9.0)
        static let iOS9 = (VersionType.SYS_VERSION_FLOAT >= 9.0 && VersionType.SYS_VERSION_FLOAT < 10.0)
        static let iOS10 = (VersionType.SYS_VERSION_FLOAT >= 9.0 && VersionType.SYS_VERSION_FLOAT < 11.0)
    }
}
0
Kiran K

これはyasirmturkマクロのSwiftバージョンです。それが何人かの人々に役立つことを願っています

// MARK: System versionning

func SYSTEM_VERSION_EQUAL_TO(v: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedSame
}

func SYSTEM_VERSION_GREATER_THAN(v: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedDescending
}

func SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedAscending
}

func SYSTEM_VERSION_LESS_THAN(v: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) == NSComparisonResult.OrderedAscending
}

func SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v: String) -> Bool {
    return UIDevice.currentDevice().systemVersion.compare(v, options: NSStringCompareOptions.NumericSearch) != NSComparisonResult.OrderedDescending
}

let kIsIOS7: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("7")
let kIsIOS7_1: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("7.1")
let kIsIOS8: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("8")
let kIsIOS9: Bool = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO("9")
0
Beninho85