是否有可能在运行时检测到您的iOS应用程序在iPad mini上运行?

在运行时检测不同的硬件对于分析是有用的(除此之外,更有疑问的目的)。

许多iOS应用程序创build者可能有兴趣知道有多less用户在iPad mini上体验他们的应用程序(而不是仅仅知道有多less用户在1024×768屏幕分辨率的iPad上体验他们的应用程序 – 这也将是有趣的)。

Cocoa touch/UIKit/ObjC/C是否有公开的API可用于检测您的iOS应用程序在运行时是否在iPad mini上运行? 理想情况下,这种方法应该区分iPad 2和iPad mini(具有相同的像素数量,但不同的像素密度)。


发布脚本:我意识到很多人会考虑在运行时检测iPad mini是一个坏主意。 不过,我认为这是一个有确定答案的有效问题。 我认为这对社区是有用的。

如果Boxel没有调用未定义的行为,并且没有多余的部分,Boxel的答案会很好。 一, + [NSString stringWithCString:encoding:]需要一个Cstring – 也就是NUL结尾的字符指针(否则它将最有可能转储核心)。 另外,你不需要转换成NSString ,因为sysctlbyname()提供了一个普通的旧Cstring(当然没有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); 

编辑:现在,答案也是固定的。

使用sysctlbyname获取平台string,然后将其与此处列出的IPSW前缀string进行比较。 它看起来像目前唯一的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); 

没有可靠的,面向未来的方式来检测iPad mini的像素密度。 其他答案build议查看hw.machinestring。 但是我们并不知道(截止到我写这篇文章的时候),iPad迷你手机模型将iPad2,6 (尽pipe我们可以做出一个有根据的猜测: iPad2,6可能会有GSM和iPad2,7可能会有CDMA )。

查看hw.machinestring进行分析hw.machine 。 但是让它影响你的应用程序的用户界面是很危险的,因为即使是当前iPad mini的iPad2,5string也是可以改变的。

当iPad 2出来时,wifi模式的string是iPad2,1 。 后来(当他们发布iPad 3的时候), 他们改变了iPad 2的硬件,把hw.machinestring改成了iPad2,4 ,但是他们仍然把它叫做iPad 2.同样的事情可能发生在iPad mini上 – 甚至iPad 2又一次! 例如,苹果公司可能会发布另一个版本的iPad 2硬件,并给它机器串iPad2,8

导入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打印什么。 你能让我知道吗?