是否有可能在运行时检测到您的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.machine
string。 但是我们并不知道(截止到我写这篇文章的时候),iPad迷你手机模型将iPad2,6
(尽pipe我们可以做出一个有根据的猜测: iPad2,6
可能会有GSM和iPad2,7
可能会有CDMA )。
查看hw.machine
string进行分析hw.machine
。 但是让它影响你的应用程序的用户界面是很危险的,因为即使是当前iPad mini的iPad2,5
string也是可以改变的。
当iPad 2出来时,wifi模式的string是iPad2,1
。 后来(当他们发布iPad 3的时候), 他们改变了iPad 2的硬件,把hw.machine
string改成了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打印什么。 你能让我知道吗?