10

新しい ARM プロセッサを搭載したデバイス (iPhone 3GS や一部の iPod 3G など) と古い ARM プロセッサを搭載したデバイスを実行時に区別する方法を探しています。uname() を使用してデバイス モデルを判別できることはわかっていますが、ARM プロセッサで強化された iPod touch 3G の一部のみであるため、これでは十分ではありません。

したがって、私はこれらのいずれかを探しています:

  1. プロセッサのモデルを検出する方法 - 何もないと思います。
  2. ARM ネオン命令がサポートされているかどうかを判断する方法 - これから答えを導き出すことができます。
  3. デバイスの合計ストレージ サイズを決定する方法 - これを既知のデバイス モデルと組み合わせると、ハッキリと答えが得られる可能性があります。
  4. <ランダムなアイデアを入力>

前もって感謝します :)

4

4 に答える 4

12

あなたが求めているものとは正確には異なりますが、簡単な解決策の 1 つは、ARMv6 と ARMv7 の両方の実行可能コードが含まれるように、アプリケーションをファットにビルドすることです。これを行うと、適切なコードがプロセッサ上で自動的に実行されるため、ランタイム チェックを行う必要はありません。事実上、ローダーにランタイム検出を任せることができます。

これを行うには、XCode プロジェクトのアーキテクチャ設定を「標準 (armv6)」から「最適化 (armv6 armv7)」に変更します。

次に、実装でこれを行います。

#if defined __ARM_NEON__
    // Code that uses NEON goes here
#else  // defined __ARM_NEON__
    // Fallback code without NEON goes here
#endif // defined __ARM_NEON__

(非 NEON) ARMv7 機能をチェックするために使用できる同様のマクロがありますが、頭の中で思い出せません。

本当に実行時ディスパッチを行いたい場合は、libc のsysctlbyname関数を調べてください。具体的には、HW_MACHINE_ARCHパラメータを調べると役に立つと思います。

于 2009-10-21T14:34:23.540 に答える
5

私が考えることができる 1 つの回避策は、OpenGL ES 2.0 が利用可能かどうかを検出することです。これは、新しいプロセッサが有効になっているためです。

その方法については、mobileorchardに記事があります。

于 2009-10-21T14:18:34.013 に答える
1

編集: 後で気づいた明白な穴を残したので、この回答を撤回しました: 将来のハードウェアで未知のサブタイプを取得した場合はどうすればよいですか? これは将来を保証するものではありませんでした。また、文書化されていない API の使用に対する Apple のゼロ トレランスを考えると、その API の文書化されたステータスの不確実性は役に立ちません。

Stephen Canon の回答を使用して、アプリケーションを太くする必要があります。現時点では、信頼性が高く将来性のあるランタイム検出は実現できません (残念なことに、断言します)。

于 2010-04-06T14:14:03.057 に答える
0

私はこれが不器用であることを知っていますが、私の頭に浮かぶ最高のものは、デバイスがビデオ録画をサポートしているかどうかを検出することです. 現在、ARM7 ベースの iPhone および iPod デバイスのみがサポートしているため、正当な方法だと思います。

これを行うには、UIImagePickerController の availableMediaTypesForSourceType を kUTTypeMovie の isSourceTypeAvailable と組み合わせて使用​​します。

于 2009-11-14T23:26:48.800 に答える