13

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

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

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


Post Script:我意识到很多人会认为在运行时检测 iPad mini 是个坏主意。但是,我认为这是一个有效的问题,有明确的“是”或“否”答案。我认为社区知道的答案很有用。

4

4 回答 4

8

如果 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);

编辑:现在答案也已确定。

于 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 硬件的另一个版本并为其赋予机器字符串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 回答