1. ホーム
  2. ios

[解決済み] iOSのバージョンを確認する方法を教えてください。

2022-03-21 03:23:10

質問

を確認したい。 iOS バージョンより大きい 3.1.3 などと試してみました。

[[UIDevice currentDevice].systemVersion floatValue]

が、うまくいかないので、aが欲しいだけです。

if (version > 3.1.3) { }

どうすれば実現できるのでしょうか?

どのように解決するのですか?

クイックアンサー ...


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
}

弱くリンクされたクラスについては、直接メッセージを送っても安全です。特に、これは "Required" として明示的にリンクされていないフレームワークのために動作します。見つからないクラスについては、式は 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]];
}

オペレーティングシステムのバージョンと比較する。

比較的稀なケースとして、OSのバージョンを確認する必要がある場合を考えてみましょう。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)。