我正在为iPod Touch开发一个iOS应用程序,在该应用程序中,我的应用程序始终显示服务器时间。每当应用程序进入前台时,我总是通过对服务器进行web服务调用来同步应用程序时间和服务器时间。如果我的服务器和客户端之间的连接中断了几个小时,我将无法同步应用程序时间。我读到iOS不支持在应用程序处于后台时运行计时器,以下提到的少数有限情况除外:
- 在后台向用户播放音频内容的应用程序,如音乐播放器应用程序
- 让用户随时了解自己位置的应用程序,如导航应用程序
- 支持互联网语音协议(VoIP)的应用程序
- 需要下载和处理新内容的新闻看台应用程序
- 从外部附件接收定期更新的应用程序
那么,我如何跟踪申请时间呢?每当用户切换到我的应用程序时,他都需要查看服务器时间,所以我需要运行计时器来更新上次同步的服务器时间。
其他答案的组合,创建一个类,负责获取服务器时间和使用NSDate* lastSync
和applicationDidBecomeActive
的组合维护应用程序最后一次同步到服务器的时间。例如:
-(void)applicationDidBecomeActive:(UIApplication*)application {
[ServerTimeSync sharedInstance] resync];
}
ServerTimeSync将使用上次同步时间维护NSDate*
属性(您需要将服务器提供的内容转换为NSDate*
)。
当应用程序进入后台时,您可以存储NSDate
。当它恢复时,再次获取当前的NSDate
,并将差异添加到存储的服务器时间中。
您根本不需要计时器。
我建议您在与服务器同步时间时,让它返回当前的UNIX时间戳。然后你可以做:
[[NSDate date] timeIntervalSince1970];
以获取设备的当前UNIX时间戳。然后,您可以存储这两个时间戳之间的差异。这是服务器时间和设备时间之间的时钟偏移。
现在,您可以通过获取设备的当前UNIX时间戳并将时钟偏移添加到其中来计算服务器的大致时间。在显示时调整时区(如果需要),就完成了。无论何时与服务器同步时间,都可以刷新存储的时钟偏移值。
如果你想获得灵感,你也可以尝试在确定时钟偏移时测量并考虑网络延迟。
这种方法应该比尝试存储服务器的绝对时间戳,然后使用计时器(或任何其他机制)跟踪经过的时间要好得多。