一个网络时间协议客户端(以及 iOS 应用测试平台)。这是一个正在持续改进的工程。
由 Gavin Eadie 创建于 2010 年 10 月 17 日
2015年2月22日:进行了几个重要的更改,包括一个将对那些想要获取系统时间与网络时间差值一次性值的用户有帮助的更改。
在此更改之前,ios-ntp 会使用来自一组与时间服务器关联的重复时间估计,不断通过采样这些值来确定最佳时间。这是具有持续低级任务监控时间的计算机的模型。iOS 应用所需的时钟不同;它们更有可能需要按需快速估计时间。为了给开发者提供能力,现在可以访问使用 'associations'。
现在,关联可以从中继时间服务器获取一次时间度量,因此 iOS 应用可以创建一个关联,用它来获取时间,然后完成。
此代码在 32 位和 64 位 iOS 设备上运行。
此代码 需要 iOS 7 或更高版本。
最老款 iPhone、iTouch 或 iPad 上的时钟并未与正确时间紧密结合。在从电话系统获取时间的设备的情况下,有一个设置可以启用与电话公司时间的同步,但该时间已知与正确时间相差超过一分钟。
此外,用户可能会更改他们的设备时间,严重影响到依赖于正确时间执行功能的软件,或者试图将他们的设备时钟调至过去,以避免过期日期。
该项目包含使用简单的网络时间协议(SNTP:RFC 5905)从标准时间服务器获取时间的代码。该实现并不像该文件中所描述的那样严格,因为目标是改进到数十毫秒的时间精度,而不是微秒。
使用NTP协议的计算机通常将其用于连续的底层任务,以持续跟踪时间。一个后台应用程序使用一组时间服务器中的偶然时间估计值来通过时间采样决定最佳时间。iOS应用程序不同,更有可能希望获得一次性的时间快速估计。
ios-ntp提供了连续和按需两种操作模式。连续模式使用多个与时间服务器的“关联”,这些服务器使用计时器重复获取时间估计值。但是,开发者可以使用这些关联从某个服务器一次性获取时间。
可以将此代码作为源代码或以框架的形式集成到Xcode项目中。框架的使用暂时不可用,但将很快恢复。
关于使用框架的更多内容即将揭晓。
下载ios-ntp项目,将其添加到您的项目中,编译并运行。您需要
#import "ios-ntp.h"
在ios-ntp中引用。
只需创建一个NetworkClock
。一旦创建,NTP进程就会开始轮询“ntp.hosts”文件中的时间服务器(如果找不到文件,将使用一组默认服务器)。您可以在应用程序启动时启动它,以确保在实际使用之前时间得到了很好的同步,只需在AppDelegate的didFinishLaunching
方法中调用它即可。
NetworkClock * nc = [NetworkClock sharedNetworkClock];
然后至少等待十秒钟,等待某些时间服务器做出响应,然后再调用
NSDate * nt = nc.networkTime;
在不再信任的服务器开始从池中丢弃之前,可能需要大约一分钟的时间。
如果NetworkClock像NetAssociation那样有一个回调到代理方法的机制,那么当它有一个好时间时,那可能更好。但是,目前它还没有这样做,所以您必须等待事情稳定下来。
这种用法稍微复杂一些。开发人员必须创建一个NetAssociation
(指定某些时间服务器),然后告诉它从该服务器获取时间。这个关联使用一个代理方法返回自己与时间信息。
netAssociation = [[NetAssociation alloc] initWithServerName:@"time.apple.com"];
netAssociation.delegate = self;
[netAssociation sendTimeQuery];
...
- (void) reportFromDelegate {
double timeOffset = netAssociation.offset;
}
iOS是一个事件驱动系统,强调对触摸手势的快速响应,以牺牲其他活动为代价。这鼓励广泛使用通知和代理等设计模式,因此,我认为,在此环境中计算小时间差受到了影响。
对一个时间服务器的经验观察显示,偶尔的偏差比通常值大得多;任何单个服务器的偏差计算标准差高于预期,我不知道原因。
MIT 许可 版权(c)2010-2015,Ramsay Consulting
关于构建框架的更多内容即将揭晓。
2014年11月19日:今天对ios-ntp进行了大量更新,使其适应现代世界。更改包括一个错误修复,但主要是为了使代码符合最近的Xcode更改和需求。
以下jbenet的"用法"注释中的一些由于这些更改可能不完全准确,我将会尽快更新文本。
最后,请注意,这段代码最初是在只有32位iOS设备时编写的。在我写这篇文章的时候,仍然有运行最新版iOS的32位设备(例如iPhone 4S),但所有新款iOS设备都具有64位架构(例如iPhone 6),并且Apple要求支持这一点。