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

时间:2012-09-01 02:55:12

标签: iphone objective-c ipad device uidevice

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

解决方案1:

NSString *deviceType = [UIDevice currentDevice].model;

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

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

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

解决方案3:使用UIDeviceHardware找到here

此代码看起来非常过时,似乎访问设备上的私有数据。甚至有人争论使用此应用的应用是否会获得批准。更重要的是,我不知道它是如何工作的:)另外还有here

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

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

提前致谢。

3 个答案:

答案 0 :(得分:6)

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

  

可以选择合适的最终图像尺寸和平铺尺寸,   但是留给开发者的练习。请注意该设备   类型/版本字符串(例如“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对于iPod touch第4代来说将是iPod4,1

此代码是您发布的两个Github示例的根本所在。

答案 1 :(得分:1)

从技术上讲,[UIDeviceHardware platform]应该可以正常工作,您应该将其原样发送到您的服务器。您还应该发送iOS版本以及平台ID,以便在将来的操作系统中更改平台ID时免除麻烦。

由于此处使用的函数sysctlbyname已有详细记录,因此我认为Apple不会对您使用规则编号2.5。但是,仍然有规则号17.1:

  

17.1应用程序无法在未获得用户事先许可的情况下传输有关用户的数据并向用户提供访问权限   有关数据使用方式和位置的信息

如果设备平台与用户有关,那么这是有争议的。我的建议是,你应该提交应用程序,假设你没有违反17.1,从来没有提到过。审稿人很可能不知道你在幕后做了什么。

答案 2 :(得分:0)

你提到的UIDeviceHardware足够好但有点过时了。 你可以尝试this 使它更像苹果风格,所以可能会更喜欢它。