在运行时检测不同的硬件对于分析(以及其他更有问题的目的)非常有用。
许多iOS应用程序创建者可能有兴趣知道有多少用户在iPad mini上体验他们的应用程序(而不仅仅知道有多少用户在iPad上以1024x768的屏幕分辨率体验他们的应用程序 - 这也很有趣)。
Cocoa touch/UIKit/ObjC/C
中是否有可用于检测您的iOS应用在运行时在iPad mini上运行的公共API?理想情况下,这种方法应该区分iPad 2和iPad 2。 iPad mini(具有相同的像素数,但像素密度不同)。
Post Script:我意识到很多人会认为在运行时检测iPad mini是一个坏主意。但是,我认为这是一个有效的问题,肯定是或否答案。我认为这个答案对社区来说很有用。
答案 0 :(得分:8)
+ [NSString stringWithCString:encoding:]
需要一个C字符串 - 也就是说,一个NUL终止的字符指针(否则它很可能会转储核心)。此外,您不需要转换为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);
编辑:现在答案也已修复。
答案 1 :(得分:4)
使用sysctlbyname获取平台字符串,然后将其与列出的here列出的IPSW前缀字符串进行比较。它看起来像目前唯一已知的iPad Mini是&#34; iPad2,5&#34;
示例:
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);
答案 2 :(得分:3)
没有可靠,面向未来的方法来检测iPad mini的像素密度。其他答案建议查看hw.machine
字符串。但我们不知道(截至我写这篇文章的时候)iPad mini蜂窝模型的字符串是什么(虽然我们可以做出有根据的猜测:iPad2,6
可能会有GSM和iPad2,7
可能会有CDMA)。
可以查看hw.machine
字符串进行分析。但是让它影响你的应用程序的用户界面是危险的,因为即使是当前iPad mini的iPad2,5
字符串也可能会发生变化。
当iPad 2问世时,wifi模型的字符串为iPad2,1
。后来(当他们发布iPad 3时),they changed the iPad 2 hardware and changed the hw.machine
string to iPad2,4
,但他们仍称它为iPad 2.同样的事情可能发生在iPad mini上 - 或者甚至再次使用iPad 2!例如,Apple可以发布另一个版本的iPad 2硬件,并为其提供机器字符串iPad2,8
。
答案 3 :(得分: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会打印什么。你能让我知道吗?