ios - 確認 - objective c と は




iOSのバージョンを確認するには? (20)

好ましいアプローチ

Swift 2.0では、はるかに便利な構文を使って可用性チェックを追加しました。 これで、より洗練された構文でOSのバージョンを確認できます:

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

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

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以降の最小デプロイメントターゲットの場合は、 UIDevice systemVersion NSStringCompareOptions.NumericSearchと比較して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もっと読む。

私は、デバイスのiOSバージョンが3.1.3より大きいかどうかをチェックしたいと思います。

[[UIDevice currentDevice].systemVersion floatValue]

それは動作しません、私はちょうどしたい:

if (version > 3.1.3) { }

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


クイックアンサー...


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を使用して現在のデバイスでUIPopoverControllerが使用可能かどうかを確認できます。

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

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

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

CLLocationManagerUIDeviceなどのクラスによっては、デバイスの機能をチェックするためのメソッドが用意されています。

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

古いシステムを対象とするプロジェクトでは、 UIDevice systemVersionを使用できます。 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が必要と判断したsystemVersionは、それを文字列として扱うか、パッチのリビジョン番号を切り捨てる危険性があります(例:3.1.2 - > 3.1)。


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

[[UIDevice currentDevice] systemVersion]

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


nv-ios-versionプロジェクト(Apache License、Version 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
nv-ios-version

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


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のバージョン番号を確認することは、どちらの方法で行ってもかまいません。 このように依存関係を厳密にコード化すべきではありません。常に、機能、能力、またはクラスの存在をチェックしてください。 このことを考慮; アップルはクラスの下位互換性のあるバージョンをリリースすることができます。論理的にOSのバージョン番号を検索し、クラスの存在を確認しない場合は、使用しないコードを使用します。

NSHipster

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部分を介して


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

これを試して

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { 
// do some work
}

パーティーに少し遅れてしまいましたが、iOS 8.0に照らしてこれは関連性があります:

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

[[UIDevice currentDevice] systemVersion]

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

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

私はそれがiOS 8.0のrequestWhenInUseAuthorizationを呼び出さなければならないロケーションマネージャにとって有用だが、そのメソッドはiOS <8


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

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

参照された推奨方法を使用して...ヘッダーファイルに定義がない場合は、いつでも希望の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;
}


私はこれが古い質問だと知っていますが、誰かがAvailability.hコンパイル時マクロについて言及していたはずです。 他のすべてのメソッドはランタイムソリューションであり、ヘッダーファイル、クラスカテゴリ、またはivar定義では機能しません。

これらの状況では、

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

this答えはh / t


試してください:

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
}

迅速なForget [[UIDevice currentDevice] systemVersion]とNSFoundationVersionNumberを使用してシステムのバージョンを確認する新しい方法。

NSProcessInfo -isOperatingSystemAtLeastVersionを使用できます

     import Foundation

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

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

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

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

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

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




objective-c