7

アプリが実行されているデバイスを検出する方法を探しています。ソフトウェアのバージョンには興味がありません。多くの質問を検索しましたが、(驚くべきことに)次の理由で私のニーズを満たすものはありませんでした:

解決策 1:

NSString *deviceType = [UIDevice currentDevice].model;

「iPad」しか表示されないため、これは機能しません。iPad、iPad 2、新しい iPad、iPhone 3GS、iPhone4 などであるか知りたいです。

解決策 2:デバイスの種類をテストせず、個々の機能を確認する

デバイス固有の操作を実行するのではなく、このデータでユーザー統計を収集したいので、これは当てはまりません。

解決策 3:ここにあるUIDeviceHardware を使用する

このコードはかなり時代遅れに見え、デバイス上のプライベート データにアクセスしているようです。これを使用するアプリが承認されるかどうかについても議論があります. さらに重要なことに、それがどのように機能するのかわかりません:)代替案もここにあります

私が言及した最後の2つは安全に使用できますか? それらは将来的に準拠していますか? それらは Apple の承認規則に準拠していますか?

または、これを回避する他の方法はありますか?

前もって感謝します。

4

3 に答える 3

6

Apple は、そのサンプル コードでそのような API を使用しています。サンプル プロジェクトを引用するLargeImageDownsizingには、ファイルのLargeImageDownsizingViewController.m83 行目から:

適切な結果の画像サイズとタイル サイズを選択することはできますが、開発者の課題として残されています。デバイス タイプ/バージョン文字列 (たとえば、"iPhone2,1" は、sysctlbyname 関数を使用して実行時に決定できることに注意してください。

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString* _platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
free(machine);

私の場合の _platform はiPod4,1、iPod touch 第 4 世代用です。

このコードは、投稿した両方の Github の例のルートにあるものです。

于 2012-09-01T03:52:34.427 に答える
1

技術的には、[UIDeviceHardware platform]問題なく動作するはずなので、そのままサーバーに送信する必要があります。また、将来の OS でプラットフォーム ID が変更された場合に備えて、プラットフォーム ID と一緒に iOS バージョンも送信する必要があります。

ここで使用されている関数sysctlbynameは十分に文書化されているため、Apple がルール番号 2.5 を使用してあなたを攻撃することはできないと思います。ただし、まだルール番号 17.1 があります。

17.1 アプリは、ユーザーの事前の許可を得ずにユーザーに関するデータを送信することはできず、データが使用される方法と場所に関する情報へのアクセスをユーザーに提供することはできません

デバイス プラットフォームがユーザーに関するものかどうかは議論の余地があります。私のアドバイスは、17.1 に違反していないと仮定してアプリを送信し、それについて決して言及しないことです。レビュアーはあなたが裏で何をしているのか知らない可能性が高いです。

于 2012-09-01T03:47:45.880 に答える
0

あなたが言及したUIDeviceHardwareは十分に良いですが、少し時代遅れです。あなたはこれ をよりリンゴスタイルにしたので、彼らがそれをもっと好きになるかもしれないので、それを試すことができます。

于 2012-09-20T07:45:06.247 に答える