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

时间:2012-11-13 19:00:30

标签: objective-c ios ipad cocoa-touch ipad-mini

在运行时检测不同的硬件对于分析(以及其他更有问题的目的)非常有用。

许多iOS应用程序创建者可能有兴趣知道有多少用户在iPad mini上体验他们的应用程序(而不仅仅知道有多少用户在iPad上以1024x768的屏幕分辨率体验他们的应用程序 - 这也很有趣)。

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


Post Script:我意识到很多人会认为在运行时检测iPad mini是一个坏主意。但是,我认为这是一个有效的问题,肯定是或否答案。我认为这个答案对社区来说很有用。

4 个答案:

答案 0 :(得分:8)

如果Boxel没有调用未定义的行为并且它没有多余的部分,那么Boxel的答案会很好。一,+ [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会打印什么。你能让我知道吗?