计算iOS应用程序中的时间间隔



我正在为iPod Touch开发一个iOS应用程序,在该应用程序中,我的应用程序始终显示服务器时间。每当应用程序进入前台时,我总是通过对服务器进行web服务调用来同步应用程序时间和服务器时间。如果我的服务器和客户端之间的连接中断了几个小时,我将无法同步应用程序时间。我读到iOS不支持在应用程序处于后台时运行计时器,以下提到的少数有限情况除外:

  • 在后台向用户播放音频内容的应用程序,如音乐播放器应用程序
  • 让用户随时了解自己位置的应用程序,如导航应用程序
  • 支持互联网语音协议(VoIP)的应用程序
  • 需要下载和处理新内容的新闻看台应用程序
  • 从外部附件接收定期更新的应用程序

那么,我如何跟踪申请时间呢?每当用户切换到我的应用程序时,他都需要查看服务器时间,所以我需要运行计时器来更新上次同步的服务器时间。

其他答案的组合,创建一个类,负责获取服务器时间使用NSDate* lastSyncapplicationDidBecomeActive的组合维护应用程序最后一次同步到服务器的时间。例如:

-(void)applicationDidBecomeActive:(UIApplication*)application {
  [ServerTimeSync sharedInstance] resync];
}

ServerTimeSync将使用上次同步时间维护NSDate*属性(您需要将服务器提供的内容转换为NSDate*)。

当应用程序进入后台时,您可以存储NSDate。当它恢复时,再次获取当前的NSDate,并将差异添加到存储的服务器时间中。

您根本不需要计时器。

我建议您在与服务器同步时间时,让它返回当前的UNIX时间戳。然后你可以做:

[[NSDate date] timeIntervalSince1970];

以获取设备的当前UNIX时间戳。然后,您可以存储这两个时间戳之间的差异。这是服务器时间和设备时间之间的时钟偏移。

现在,您可以通过获取设备的当前UNIX时间戳并将时钟偏移添加到其中来计算服务器的大致时间。在显示时调整时区(如果需要),就完成了。无论何时与服务器同步时间,都可以刷新存储的时钟偏移值。

如果你想获得灵感,你也可以尝试在确定时钟偏移时测量并考虑网络延迟。

这种方法应该比尝试存储服务器的绝对时间戳,然后使用计时器(或任何其他机制)跟踪经过的时间要好得多。

最新更新