防止骗子:它真的是移动设备,还是模拟器?

时间:2011-06-16 20:22:39

标签: android objective-c ios cocoa-touch

我正在同时在android和iPhone上开发一个应用程序。由于我的地理定位应用程序的性质,重要的是信息真正来自手机,而不仅仅是碰巧安装了应用程序的模拟器。

我可以从设备中获取某种值以确定它是否是模拟器吗?我不希望用户通过简单地为他们的纬度/经度坐标设置自己的值来欺骗系统。我知道没有什么是万无一失的,但我至少会尽可能地消除欺诈行为。

我计划制定算法来验证收到的数据,例如跳跃n。在英里距你最后一个位置的秒数 - 但是在某些情况下这可能会导致误报 - 特别是在某些机器人身上,你可以神奇地放在世界各地移动2英尺。

这适用于Android和iOS。任何一部手机的答案都可以。

2 个答案:

答案 0 :(得分:3)

您可以使用[UIDevice currentDevice] .model获取iOS的当前设备型号。 UIDevice class reference将为您提供可以比较的常量字符串。向下滚动到模型属性以获取更多信息。

没有太多的Android经验,但this应该有效。

答案 1 :(得分:0)

对于Android,事实证明,它比仅仅确定你是否在模拟器上更复杂(可以使用上面的Peter链接完成),因为能够在“开发设置”下允许模拟位置(例如,参见this app,允许用户设置模拟位置,然后可供其他应用程序使用)。

根据您用于检索位置提供程序的方法(例如,使用LocationManager.getProvider()的返回值调用LocationManager.getBestProvider()),您最终可能会使用模拟提供程序。我一直无法找到确定提供者是否为Mock的任何确定方法(例如,没有LocationProvider的属性表明它是模拟,没有位置的属性表明它是假的,等等)。但是,您可以阅读Secure Settings以确定是否启用了ALLOW_MOCK_LOCATION,并且在此情况下不允许您的应用运行;由于该设置是安全设置之一,因此无法以编程方式进行更改。