13

実行時にさまざまなハードウェアを検出することは、分析に役立ちます (特に、さらに疑わしい目的があります)。

多くの iOS アプリ作成者は、iPad mini で自分のアプリを体験しているユーザーの数を知りたいと考えているかもしれません (画面解像度が 1024x768 の iPad で自分のアプリを体験しているユーザーの数を知るだけでなく、これも興味深いでしょう)。

Cocoa touch/UIKit/ObjC/C実行時に iOS アプリが iPad mini で実行されていることを検出するために使用できるパブリック API はありますか? 理想的には、この方法で iPad 2 と iPad mini (ピクセル数は同じでピクセル密度が異なる) を区別する必要があります。


追記: 多くの人が、実行時に iPad mini を検出するのは悪い考えだと考えるでしょう。しかし、これは明確なYesかNoで答えられる有効な質問だと思います。コミュニティが知っておくと役立つと思う答えです。

4

4 に答える 4

8

ボクセルの答えは、未定義の動作を引き起こさず、余分な部分がなければ良いでしょう。1 つ+ [NSString stringWithCString:encoding:]は、C 文字列、つまり、NUL で終了する char ポインターが必要です (そうしないと、コア ダンプが発生する可能性が高くなります)。また、への変換は必要ありませんNSString-sysctlbyname()はプレーンな古い C 文字列 (もちろん NUL ターミネータなし) を提供するため、直接使用strcmp()して数十の CPU サイクルを節約できます。

#include <sys/sysctl.h>

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size + 1);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
machine[size] = 0;

if (strcmp(machine, "iPad2,5") == 0) {
    /* iPad mini */
}

free(machine);

編集:その答えも修正されました。

于 2012-11-13T19:34:15.563 に答える
4

sysctlbyname を使用してプラットフォーム文字列を取得し、ここにリストされている IPSW プレフィックス文字列と比較します。現在知られているiPad Miniは「iPad2,5」のみのようです

例:

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size + 1);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
machine[size] = 0;

if(strcmp(machine, "iPad2,5") == 0) {
    // do something special on the iPad Mini    
}

free(machine);
于 2012-11-13T19:19:28.167 に答える
3

iPad mini のピクセル密度を検出するための、信頼できる将来性のある方法はありません。他の答えは、文字列を見ることを提案していhw.machineます。しかし、(私がこれを書いている時点では) iPad mini セルラーモデルの文字列がどうなるかはわかりません (ただし、知識に基づいた推測はできます:iPad2,6おそらく GSM があり、iPad2,7おそらく CDMA があるでしょう)。

hw.machine分析のために文字列を確認しても問題ありません。iPad2,5ただし、現在の iPad miniの文字列でさえ変更される可能性があるため、アプリのユーザー インターフェイスに影響を与えるのは危険です。

iPad 2 が出たとき、wifi モデルの文字列はiPad2,1. その後 (iPad 3 がリリースされたとき)、彼らは iPad 2 ハードウェアを変更し、hw.machine文字列をiPad2,4に変更しましたが、それでも iPad 2 と呼ばれていました。同じことが iPad mini で発生する可能性があり、iPad 2 で再び発生する可能性もあります! たとえば、Apple はさらに別のバージョンの iPad 2 ハードウェアをリリースし、それに machine string を与えることができますiPad2,8

于 2012-11-13T19:50:50.977 に答える
1

CoreTelephony.framework をインポートします。デバイスでこれを試す

#import <sys/utsname.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>

NSString*
machineName()
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString:systemInfo.machine
                          encoding:NSUTF8StringEncoding];
}

これで今までの目的は解決しました。しかし、私はiPad miniを持っていないので、iPad miniで何を印刷するのかわかりません。教えていただけますか?

于 2012-11-13T19:49:52.217 に答える