11

iPhone と iPad の両方でゲームを作りたいです。そのため、このプロジェクトをユニバーサル アプリとしてゼロから開始することは理にかなっています。ただし、iOS 4 は iPad ではまだ利用できないため、現在 iPhone と iPad では 2 つの異なるバージョンの iOS が実行されています。私のゲームでサポートしたい 2 つの iOS 4 機能 (GameCenter と iAd) があります。

  1. この場合、このプロジェクトをユニバーサル アプリとして作成するのは悪い考えでしょうか?
  2. そうでない場合、iOS の 2 つの異なるバージョンをサポートするユニバーサル アプリを構築する際に考慮すべきことは何ですか?
  3. 推測されているように、秋に Apple が iPad 用の iOS 4 をリリースすることに賭けても大丈夫でしょうか?
  4. もしそうなら、iOS 4 の機能 (GameCenter と iAd) を自分のゲームの iPad バージョンに組み込むことはできますか?

あなたのすべての知恵を前もってどうもありがとう!

編集:この問題にはリスクの管理が含まれることを理解しています。私はリスクを認識していますが、iOS がさまざまな iOS デバイス間で断片化されている場合のユニバーサル アプリの構築に関連する技術設計の考慮事項に関心があります。

4

4 に答える 4

16

ユニバーサル アプリを構築しようとしている場合は、次の 2 つのソース コード スニペットを覚えておいてください。

  • 現在のデバイスで利用可能な場合にのみクラスを使用する

    次のコードを検討してください。

    UILocalNotification* n = [[UILocalNotification alloc] init];
    

    ユニバーサル アプリをビルドする場合、このコードにより、UILocalNotification クラスを認識しない iOS バージョンを実行しているデバイスでランタイム エラーが発生します。

    次のコード スニペットを使用すると、下位互換性を維持しながら、コードで UILocalNotification を引き続きサポートできます。

    Class notificationClass = NSClassFromString(@"UILocalNotification");
    if (notificationClass) {
      UILocalNotification* n = [[notificationClass alloc] init];
    }
    

    この手法により、クラスをサポートするデバイス上の特定の OS バージョンでは使用できないクラスを使用できます。

  • 現在のデバイスで利用可能な場合にのみメソッドを使用する

    次のことをしたいとします。

    [[UIApplication sharedApplication] scheduleLocalNotification:n];
    

    次のコードを使用して、現在のデバイスで使用できる場合にメソッドを条件付きで呼び出します。

    if ([UIApplication instancesRespondToSelector:@selector(scheduleLocalNotification:)]) {
      [[UIApplication sharedApplication] scheduleLocalNotification:n];
    }
    

ユニバーサル アプリを作成するために知っておく必要があるのは、おそらくこれら 2 つの手法だけです。デバイスの機能に応じて条件付きでコードを実行すれば、問題ないはずです。

そうは言っても、iPad はおそらく iPhone の対応するものとは異なる UI を使用することを考慮する必要があります。残念ながら、iOS 4 の機能が iPad で利用可能になるまで、iPad の UI をテストすることはできません。しかし、これはあまり問題にはなりません[[UIDevice currentDevice] userInterfaceIdiom]。iPad で実行しているかどうかを確認するために使用する場合、ユニバーサル アプリが iPad UI をまだ持たないコードを実行するのを防ぐことができます。Apple が iPad 用の iOS 4 をリリースしたら、UI を実装し、そのチェックを削除して、ストアにアップデートをリリースできます。

于 2010-07-23T17:20:44.483 に答える
11

主に次の 2 つのことを行う必要があります。

  1. 3.2 SDK に存在しないフレームワークを弱リンクします。
  2. iOS 4 の新しい API のランタイム テストを記述します。

最初に、ターゲットを右クリックして [情報を見る] を選択します。フレームワークはインスペクター (「一般」タブの下) に一覧表示され、その横にドロップダウン ボックスがあり、「弱い」リンクを選択できます。これにより、フレームワークが存在しない場合でもアプリが実行されます。

2 つ目は、次のような方法で iOS 4 の新しいブロックベースのアニメーションをテストできます。

if ([UIView respondsToSelector:@selector(animateWithDuration:animations:)]) {
    // Your awesome animation code here
} else {
    // Your almost-as-awesome, non-block-based animation code here.
}

などの内省的なメソッドを使用する-respondsToSelector:ことで、現在実行中の OS がサポートしていない呼び出しを回避できます。

また、iPhone OS 3.0 をサポートする場合も、これらと同じルールが適用されることに注意してください。

最後に、お勧めではありませんが、次のようにすることもできます。

#ifdef __IPHONE_4_0
    // Your iOS 4.0-compatible code here
#elif defined(__IPHONE_3_2)
    // Your iPhone OS 3.2-compatible code here
#elif defined(__IPHONE_3_0)
    // Your iPhone OS 3.0-compatible code here
#endif

なぜこれはお勧めできませんか?シンプル: 番号が最大の iOS バージョンのコードのみがコンパイルされます。iPhone アプリは個別の iOS バージョン用に個別にコンパイルされていないため、これを実際に機能させるには、アプリの複数のバージョンをリリースする必要があります。

于 2010-07-23T17:19:36.467 に答える
2

このテーマに関する良い投稿: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

于 2010-07-23T17:19:07.313 に答える
1

これは、リスク管理に関するすべての問題です。リスクには次のものがあります。

  1. Apple は期待された「統合 4.1」OS を必要な時間内にリリースしない
  2. OS はニーズに合わせてリリースされますが、GameCenter または iAds のいずれかまたは両方が含まれていません
  3. GameCenter および/または iAds が含まれていますが、期待していた正確な API と一致しません
  4. API は期待どおりですが、iPad での最初のバージョンであるため、バグがあります。
  5. 等...

各リスクのどのレベルに満足しているか、各リスクがどの程度可能性が高いと考えているか、各リスクを軽減できるかどうか、途中でこれらの問題が発生した場合のコストを判断できるのは、あなただけです。

于 2010-07-23T17:01:29.310 に答える