iPhone硬件和用户计时器随着时间的推移而不同步

时间:2011-10-17 20:57:18

标签: objective-c ios nsdate clock anti-cheat

我试图在用户运行时检测用户是否提前计时。我目前通过比较两个计时器的变化来做到这一点:[NSDate timeIntervalSinceReferenceDate]和mach_absolute_time。

基本算法是:

  • 在应用程序启动时,保存startUserClock(timeIntervalSinceReferenceDate)和startSystemClock(mach_absolute_time转换为秒)
  • 定期将计时器的当前值与各自的起始值进行区分。
  • 如果差异是不同的(在某个误差范围内),我们应该知道定时器不同步,这表明时钟发生了变化 - 理论上,唯一的时间应该是可能的,如果用户有修改了他们的时钟。

然而,似乎mach_absolute_time的增长速度略快于timeIntervalSinceReferenceDate。从短期来看,这不是一个大问题,但随着时间的推移,这种差异会加剧,我们会开始看到很多误报。

此问题似乎与硬件有关。我在iPad 1上根本看不到它,但一位同事在iPad 2上看到它,我在模拟器中看到它。

我已经确认,我将mach_absolute_time转换为秒没有问题,方法是将其替换为CACurrentMediaTime(在引擎盖下使用mach_absolute_time)。我已经尝试将timeIntervalSinceReferenceDate更改为其他计时方法(即:CFAbsoluteTimeGetCurrent)。

我的基本假设是,定时器应以相同的速率增长吗?我的想法是,除非出现根本性错误,否则他们不应该失去同步 - 他们既决定时间,又从不同点开始。

有更好的方法吗?我需要一个完全离线的解决方案 - 我们不能假设互联网连接。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用gettimeofday获取当前系统时间的值。这将返回自纪元以来的时间。

答案 1 :(得分:0)

通常,定时器不能保证同步。也许他们来自不同的来源。也许一个与时间服务器同步。

你只关心时钟之间的差异的突然变化,而不是随时间的大漂移。因此,计算时钟之间差异的变化率:

T_Diff := initial difference between clocks
T_Time := time as determined by one clock
Repeat forever:
  T_Diff' := new difference between clocks
  T_Time' := new time as determined by one clock

  # Check if time changed
  if abs((T_Diff'-T_Diff)/(T_Time'-T_Time)) > threshold:
    time_changed()

  # Update state
  T_Diff := T_Diff'
  T_Time := T_Time'

  wait_for_next_update()