6

iOS 5.1 を搭載した iPhone 4 と iOS 6.0 を搭載した iPad 4 でアプリをテストしています。私は周りを見回しましたが、驚くべきことに同様の質問は見つかりませんでした:

1- 私のアプリには、iOS 6.0 で非推奨になったメソッドがいくつかあるため、[[UIDevice currentDevice] systemVersion] を使用してシステム バージョンをテストする if/then 条件を作成し、バージョンに適したメソッドを使用する必要があると考えています。それが最も効率的な方法ですか?

2-私の理解では、ターゲットが1つしかない場合、「プロジェクト」デプロイメントターゲットと「ターゲット」デプロイメントターゲットは同じ目的を果たします。そして、iOS 5.1 がサポートされている最小の iOS であるため、そのうちの 1 つまたは両方を iOS 5.1 にする必要があります。紛らわしいのは、ターゲットが iOS 5.1 に基づいて構築されている場合、iOS 6.0 を搭載した iPad4 でどのように動作するかということです。

  • iPad OS は実行前にターゲット バージョンをチェックしますか、それとも単にコードを実行しようとするだけで、iOS 5.1 ターゲットには 6.0 と互換性のないコードがありませんか?

  • たとえそうであったとしても、5.1 のターゲットは、非推奨のメソッドを条件付きで置き換えるために構築した 6.0 のメソッドをどのようにサポートできるのでしょうか?

どうもありがとう!

4

5 に答える 5

28

非推奨のメソッド

これらのメソッドが非推奨になる前にリリースされた iOS バージョンをターゲットにしている場合は、非推奨のメソッドを使用できます。ただし、展開ターゲットが正しく設定されていると仮定すると、対象となるバージョンで非推奨のメソッドが常に非推奨でない限り、コンパイラ エラーは発生しません。つまり、コードに非推奨の警告が表示されている場合は、それらを修正するか、展開ターゲットの設定が正しいことを確認する必要があります。それらを無視しないでください!

Xcode 設定レベル

ターゲット レベルとプロジェクト レベルの両方で展開ターゲット設定を定義できるという事実に言及しています。ターゲット レベルの Xcode ビルド設定は、プロジェクト設定をオーバーライドします。したがって、これらのレベルのいずれかでのみ展開ターゲットを定義してから、他のレベルに移動して削除を押して、値が重複しないようにします。ターゲットが 1 つしかない場合は、それをターゲット レベルで定義するか、プロジェクト レベルで定義するかは問題ではありません。

後方互換性と前方互換性

最後に、後方互換性と前方互換性には多くの要因が関係しています。supportedInterfaceOrientations古い iOS バージョンでは単に無視されるような新しい iOS 6 メソッドがある場合があります。明示的なチェックを追加する必要がある場合もあります。

  • オブジェクトのメソッドを呼び出していて、そのメソッドが iOS 6 でのみ導入された場合は、次のrespondsToSelector:ようなチェックを追加する必要があります。

    // only available on iOS 6
    if ([locationManager respondsToSelector:@selector(pausesLocationUpdatesAutomatically)]) {
        locationManager.pausesLocationUpdatesAutomatically = YES;
    }
    
  • 特定のクラスが現在の iOS バージョンに存在するかどうかを確認したい場合は、次のように +class メソッドの戻り値を確認できます。

    // Only available on iOS 6
    if ([UICollectionView class]) {
        // ...
    } else {
        // class doesn't exist in this iOS version
    }
    
  • 特定の関数が利用可能かどうかを確認したい場合は、単純な if ステートメントを実行します。

    // Only available in iOS 6
    if (ABAddressBookCreateWithOptions) {
        ABAddressBookCreateWithOptions(...);
    } else {
        ABAddressBookCreate(...);
    }
    
  • 最後に、定数が利用可能かどうかを確認する場合は、そのアドレスを確認します。

    // Only available in iOS 4
    if (&UIApplicationProtectedDataDidBecomeAvailable) {
        // subscribe to notification
    }
    

Base SDK 設定は常に「最新」に設定する必要があります。

これらすべてのガイドラインに従えば、明示的なバージョン チェックを追加しなくても、ほとんどの問題を解決できます。iOS のバージョンまたはデバイス ID の確認は非常に脆弱であり、将来のバージョンでアプリが機能しなくなる可能性があります。あなたは本当にそれを避けたいです。

于 2012-11-16T17:06:10.963 に答える
4
  1. [[UIDevice currentDevice] systemVersion]OSのバージョンを検出するために使用できます。OS のバージョンを検出するのではなく、respondsToSelector:存在するメソッドNSClassFromString() != nilを確認し、クラスが存在するかどうかを確認し、そのメソッドが使用できない場合はフォールバックするために使用できます。

  2. iOS は下位互換性があるため、iOS 6 は iOS 5 アプリを問題なく実行できます。ただし、iOS 6 固有の機能を使用したいが iOS 5.1 をサポートしたい場合は、次のことを行う必要があります。

    • コンパイラが新しい API を認識できるように、6.0 SDK を使用してコンパイルします。
    • ターゲット バージョンを、サポートされている最も低いバージョンに設定します。5.1. その数よりも大きいシステムはコードを実行します。それよりも低い場合は試行されません。
    • 1. で説明した方法のいずれかを使用して、各デバイス実行コードが OS でサポートされていることを確認します。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-11-16T16:51:48.557 に答える
2

あなたがしなければならないことは、iOS のバージョンではなく、機能を検出することです。このスレッドをチェックしてください:

iOS 5 アプリでの iOS 6 機能の条件付きサポート

于 2012-11-16T16:56:43.383 に答える
0

システムバージョンをチェックするのではなく、使用しようとしている機能をチェックする必要があります。その点で、非推奨は削除されることを意味しないので、あなたがやろうとしていることは何でもiOS6のためにそこにあるかもしれないことを覚えておいてください。特定の機能をチェックするには、次のようにします。

if([TheClassInQuestion class] != nil)
{
    //use it
}
于 2012-11-16T16:48:46.070 に答える
0

iOS は下位互換性があります。iOS 5.1 用にアプリをコンパイルすると、iOS 6 でも完全に実行されます。非推奨のクラスを再実装する必要はありません。

ただし、展開バージョンを 5.0 から 6.0 に変更すると、非推奨のメソッドを使用すると Xcode によって警告が表示されます。

iOS 6 でのみ使用可能なメソッドを使用する場合は、次のチェックを使用できます。

if ([self respondsToSelector:@selector(doSomething:)]) {
        [self doSomething];
    }
于 2012-11-16T16:45:49.160 に答える