7

我正在寻找一种方法来检测我的应用程序正在运行的设备。我对软件版本不感兴趣。我搜索了很多问题,但没有一个(令人惊讶)满足我的需求,原因如下:

解决方案1:

NSString *deviceType = [UIDevice currentDevice].model;

这不起作用,因为它只给了我“iPad”。我想知道是 iPad、iPad 2、新 iPad、iPhone 3GS、iPhone4 等。

解决方案 2:不测试设备类型,检查单个功能

这不适用,因为我希望这些数据收集用户统计信息,而不是执行任何特定于设备的操作。

解决方案 3:使用此处找到的 UIDeviceHardware

这段代码看起来已经过时了,似乎可以访问设备上的私人数据。甚至存在争议,使用它的应用程序是否会获得批准。更重要的是,我不知道它是如何工作的 :) 另一种方法也可以在这里找到

我提到的最后两个中的任何一个都可以安全使用吗?他们未来是否合规?它们是否符合 Apple 的审批规则?

或者有没有其他方法可以解决这个问题?

提前致谢。

4

3 回答 3

6

Apple 在其示例代码中使用了这样的 API。要引用LargeImageDownsizing示例项目,请在第LargeImageDownsizingViewController.m83 行开始的文件中:

可以选择适当的结果图像大小和图块大小,但留给开发人员作为练习。请注意,设备类型/版本字符串(例如“iPhone2,1”可以在运行时通过使用 sysctlbyname 函数来确定:

size_t size;
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
NSString* _platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding];
free(machine);

_platform 在我的情况下将iPod4,1用于 iPod touch 第 4 代。

此代码是您发布的两个 Github 示例的根目录。

于 2012-09-01T03:52:34.427 回答
1

从技术上讲,[UIDeviceHardware platform]应该可以正常工作,您应该按原样将其发送到您的服务器。如果平台 ID 在未来的操作系统中发生变化,您还应该将 iOS 版本与平台 ID 一起发送,以免您遇到麻烦。

因为sysctlbyname这里使用的函数有据可查,所以我认为 Apple 不能使用 2.5 号规则来对付你。但是,仍然存在第 17.1 条规则:

17.1 未经用户事先许可,应用程序不得传输有关用户的数据,并为用户提供有关数据使用方式和使用地点的信息的访问权限

设备平台是否与用户有关是有争议的。我的建议是你应该提交应用程序,假设你没有违反 17.1 并且永远不要提及这一点。审阅者很可能不知道您在幕后做什么。

于 2012-09-01T03:47:45.880 回答
0

您提到的 UIDeviceHardware 已经足够好,但有点过时了。你可以试试这个 Made it more apple-style,所以他们可能会更喜欢它。

于 2012-09-20T07:45:06.247 回答