当前位置:  开发笔记 > IOS > 正文

如何在Cocoa应用程序中收到系统时间更改的通知?

如何解决《如何在Cocoa应用程序中收到系统时间更改的通知?》经验,为你挑选了2个好方法。

我有一个Cocoa应用程序,记录事件的日期戳.我需要知道系统时间何时重置以及重置多少,但我似乎无法在任何告知我发生过这种情况的通知.这种变化可能发生,因为NTP重置时钟或因为用户重置(例如从系统偏好设置).如果NSNotification我能注册接收会很好,但我愿意接受任何建议.



1> Dave Gallagh..:

Apple 在Snow Leopard(10.6)的NSSateClockDidChangeNotification中加入了NSDate的一部分.似乎没有办法在Leopard(10.5)或更早版本中执行此操作.根据Apple NSDate文档:

系统时钟更改时发布.这可以通过调用settimeofday()或用户更改"日期和时间首选项"面板中的值来启动.通知对象为null.此通知不包含userInfo字典.

这似乎并没有告诉你"多少"时间已经改变.您可以通过定期(例如,a中每5秒NSTimer)捕获系统时间来计算[NSDate date],将其保存到变量中,然后在NSSystemClockDidChangeNotification触发后,抓住新日期并使用NSDate的timeIntervalSinceDate:方法将两者进行比较以获得差异.

不是毫秒甚至是第二准确,但非常接近.

编辑: 看这篇文章.您可以使用UpTime()C命令获取CPU tics中的系统正常运行时间(稍后可以将其转换为秒).您可以使用它来计算出更改的时间(假设没有系统重启或休眠).即使系统时钟被用户或网络时间协议更改,这也可以工作.



2> Girish Kolar..:

如果有人正在寻找解决方案,请知道系统日期更改事件从10.4开始


OSStatus DateChangeEventHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) 
{
    NSLog(@"Event received!\n");    
    return 0;
}


- (void)SystemTimeChangeHandler
{
    EventTypeSpec eventType;
    eventType.eventClass = kEventClassSystem;
    eventType.eventKind = kEventSystemTimeDateChanged;

    EventHandlerUPP eventHandlerUPP =
    NewEventHandlerUPP(DateChangeEventHandler);
    EventHandlerRef eventHandlerRef = NULL;
    (void)InstallApplicationEventHandler(
                                         eventHandlerUPP,
                                         1,
                                         &eventType,
                                         self,
                                         &eventHandlerRef);

}

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有