1

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

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

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

4

3 回答 3

1

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

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

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

于 2012-07-10T01:46:20.820 回答
0

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

于 2012-07-10T01:39:59.397 回答
0

您根本不需要计时器。

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

[[NSDate date] timeIntervalSince1970];

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

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

如果您想花哨的话,您还可以在确定时钟偏差时尝试测量并考虑网络延迟。

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

于 2012-07-10T01:42:42.163 回答