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

时间:2012-07-10 01:33:53

标签: iphone objective-c ios

我正在为iPod Touch开发一个iOS应用程序,我的应用程序总是在其中显示服务器时间。通过向服务器发出Web服务调用,每当应用程序到达前台时,我总是将应用程序时间与服务器时间同步。如果我的服务器和客户端之间的连接丢失几个小时,我将无法同步应用程序时间。我读过iOS不支持在应用程序处于后台时运行计时器,除了下面提到的几个有限的情况:

  • 在后台播放用户可听内容的应用,例如音乐播放器应用
  • 随时向用户通知其位置信息的应用,例如导航应用
  • 支持互联网协议语音(VoIP)的应用
  • 需要下载和处理新内容的报亭应用
  • 从外部附件接收定期更新的应用

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

3 个答案:

答案 0 :(得分:1)

其他答案的组合,使用NSDate* lastSync和{{ 1}}。例如:

applicationDidBecomeActive

ServerTimeSync将使用上次同步时间维护-(void)applicationDidBecomeActive:(UIApplication*)application { [ServerTimeSync sharedInstance] resync]; } 属性(您需要将服务器提供的内容转换为NSDate*)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根本不需要计时器。

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

[[NSDate date] timeIntervalSince1970];

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

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

如果您想获得想象力,您还可以在确定时钟偏差时尝试测量并考虑网络延迟。

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