如何在应用程序运行之间本地检测用户的 iPhone 时钟提前?
Posted
技术标签:
【中文标题】如何在应用程序运行之间本地检测用户的 iPhone 时钟提前?【英文标题】:How can I locally detect iPhone clock advancement by a user between app runs? 【发布时间】:2011-10-30 15:15:09 【问题描述】:休闲游戏中的一个常见漏洞是人为地提前系统时钟以在游戏中跳跃。 ios 设备上的应用如何检测到这样的用户时钟提前?
不得涉及网络通信 不得在时钟提前时假定应用处于打开状态(运行或暂停) 必须检测时钟提前,检测时钟回滚是不够的理想情况下,该解决方案在重启时会很可靠,但这不是必需的。
【问题讨论】:
不要以为没有网络通信就可以做到。 GPS 接收器“可以”这样做,但我认为它不会暴露 API 中的任何时间信息。 【参考方案1】:CACurrentMediaTime 和 mach_absolute_time
看看这个问题:
iOS: How to measure passed time, independent of clock and time zone changes?
Calculating number of seconds between two points in time, in Cocoa, even when system clock has changed mid-way
CACurrentMediaTime 使用 mach_absolute_time: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreAnimation_functions/Reference/reference.html
这里有一个关于如何使用 CACurrentMediaTime 的示例: http://www.informit.com/blogs/blog.aspx?b=02b4e309-308c-468a-bab1-cebb1404be6a
这里有更多关于 mach_absolute_time 的信息: http://developer.apple.com/library/mac/#qa/qa1398/_index.html http://shiftedbits.org/2008/10/01/mach_absolute_time-on-the-iphone/
【讨论】:
mach_absolute_time 在设备重启时重置。如果用户通过重新启动来规避作弊检测是可以的,但如果重新启动错误地将他们标记为已提前时钟,那就不行了。 另外,根据 Ben Dodson 的精彩博文 bendodson.com/weblog/2013/01/29/ca-current-media-time,如果设备在播放之间进入睡眠状态一段时间,这将不起作用,因为它显示为 CACurrentMediaTime(因此 mach_absolute_time 因为它是基于它?)只计算活动设备时间而不是正常运行时间。【参考方案2】:我在考虑这样一个事实,如果这部分 GPS 数据暴露给您,CoreLocation 的东西可以做到这一点。然而,这让我开始思考。
我唯一(牵强)的建议是将某些东西放入后台处理 - 这必须是出于一小部分特定原因之一,例如在后台跟踪位置。作为其副作用,请尝试在常规计时器上检测时钟变化。 Apple 可能会拒绝它,因为很明显它没有使用位置信息,这只是利用后台处理的一个理由。
任何不涉及网络的解决方案都所以更难实施,我想知道你为什么不使用它。
【讨论】:
【参考方案3】:虽然我认为无法可靠地确定用户是否在没有网络访问的情况下手动将时钟调快,但您当然可以可靠地确定他们是否及时返回。而且由于我们知道这在物理上是不可能的,因此可以假设他们已经操纵了他们的时钟来作弊。
我的意思是,不是通常的过程来触发需要等待一段时间的应用内操作,退出应用程序并将时钟向前拨,重新启动应用程序以获得他们正在等待的任何东西然后将时钟重置回实际时间?
如果确实如此,那么根据@smgambel 的建议,您可以在每次启动时存储物理时间和当前时区,并与之前存储的时间和时区进行比较。如果时间晚于之前存储的时间,并且设备的时区没有改变,那么您可以放心地认为用户已经操纵了时钟。
【讨论】:
以上是关于如何在应用程序运行之间本地检测用户的 iPhone 时钟提前?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone - 如何在运行时检测到设备正在运行我的应用程序的临时构建