如何检测用户使用的 iOS 设备?

8
我可以帮助您进行翻译。以下是您需要翻译的内容:

我正在寻找一种方法来检测我的应用程序运行的设备。我不关心软件版本。我搜索了很多问题,但由于以下原因,没有一个问题能够满足我的需求:

解决方案1:

NSString *deviceType = [UIDevice currentDevice].model;

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

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

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

解决方案3:使用UIDeviceHardware

这段代码看起来相当过时,并且似乎访问设备上的私有数据。甚至还有争论,是否会批准使用此应用程序。更重要的是,我不知道它是如何工作的:)另一种选择也可以从这里找到。

我提到的最后两个方法中有哪一个是安全可靠的?它们是否符合未来的标准?它们是否符合苹果的批准规则?

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

谢谢您的帮助。

3个回答

6

苹果在其示例代码中使用了这样的API。引用LargeImageDownsizing示例项目,在文件LargeImageDownsizingViewController.m中从第83行开始:

选择适当的结果图像大小和平铺大小可以完成,但留给开发人员自己练习。请注意,设备类型/版本字符串(例如“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。这段代码是你发布的两个Github示例的根本基础。

谢谢。现在我知道它是安全的,我已经将它包含在我的项目中并解决了问题。 - Murat Ögat

1

从技术上讲,[UIDeviceHardware platform] 应该可以正常工作,你应该将其发送到服务器。如果平台 ID 在未来的操作系统中更改,则还应该将 iOS 版本与平台 ID 一起发送,以避免出现麻烦。

因为这里使用的函数 sysctlbyname 得到了很好的文档记录,所以我认为苹果不会根据规则 2.5 对你进行处罚。但是,仍然有规则 17.1:

17.1 应用程序不能在未获得用户事先许可并向用户提供数据使用情况和位置信息的情况下传输关于用户的数据

如果设备平台属于关于用户的信息是值得商榷的。我的建议是,假设你没有违反 17.1 提交应用程序,并永远不要提及相关内容。评论员很可能不知道你背后所做的事情。


谢谢。我正在汇总我收集的数据,并没有将其绑定到用户,所以我认为这也不违反17.1规则。我也确信他们甚至不会注意到。 - Murat Ögat

0

你提到的UIDeviceHardware还不错,但有点过时了。 你可以试试this。 我把它做得更像苹果风格,也许他们会更喜欢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接