2011-09-05 3 views
12

現在、最新のiOS 4.x SDKに対してアプリケーションがコンパイルされています。 iOS 5.0 SDKがリリースされたら、自分のアプリケーションで新しいiOS 5.0 SDK機能を使用することは可能ですが、iOS 4デバイスでも使用できます(しかし、新機能を使用している部品は無効になっています)。後方互換性を損なうことなくiOS 5機能を使用する

+0

[オプションのiPhone OS 3.0の機能を2.0対応のアプリケーションで使用するにはどうすればよいですか?](http://stackoverflow.com/questions/986589/how-do-you-optionally-use-iphone-os- 3-0-features-in-a-2-0-compatible-app) –

+0

も参照してください[iPhoneアプリを複数のSDK(ファームウェア)バージョンと互換性を持たせる方法(http://stackoverflow.com/questions/3027120/how make-iphone-app-compatible-multiple-sdk-firmware-versions)が含まれています。これらの質問のバージョンは古いものですが、同じ一般原則が適用されます。 –

答えて

10

一般質問に答えるために、Objective-Cのランタイムを使用すると、(respondsToSelector:経由で)どのメソッドオブジェクトのサポートを照会し、によってクラスのホールドを得ることができることを意味し、完全に反映しています実行時の名前(NSClassFromString経由)。 iOSバイナリは、フレームワークとの弱いリンケージという概念もサポートしています。つまり、フレームワークが利用可能であれば読み込まれますが、フレームワークが利用できない場合は致命的なエラーとはみなされません。

これは、Appleが新しいバージョンのOSをリリースしたときに、最新バージョンのOSで新機能を使用するコードを書くことができますが、新しい機能がAPIの新しいビットである場合は機能しません。

またAppleは、ClangスタティックアナライザがXcodeに追加されたときなど、新しいAPIではない新しいSDK機能を提供することがあります。これらの機能は通常、ランタイムサポートを必要としないため、完全に使用可能です。アップルがLLVMプロジェクトをコミットすると、ランタイムサポートに依存しているARCの中に新しいコンパイル時の機能がいくつかあることを示唆しているため、iOS 5は少しユニークです。実際にAppleがそれらを配布しようとしているのでツールに入っていれば、彼らは利用できなくなるだろう。

9

一部の機能が実行時に使用可能かどうかを確認できます。例えば

Class motionManagerClass = NSClassFromString(@"CMMotionManager"); 
if(motionManagerClass) { 
    CMMotionManager *motionManager = [[CMMotionManager alloc] init]; 
    if([motionManager isGyroAvailable]) { 
     //iOS device with gyro 
    }else { 
     //right iOS but device has no gyro 
    } 
}else{ 
//wrong iOS 
} 
関連する問題