簡単な答え…
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
古いシステムをターゲットプロジェクトは使用することができますsystemVersion
にUIDevice
。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)。