Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c MacOS进入睡眠状态时收到通知_Objective C_Macos_Notifications_Sleep - Fatal编程技术网

Objective c MacOS进入睡眠状态时收到通知

Objective c MacOS进入睡眠状态时收到通知,objective-c,macos,notifications,sleep,Objective C,Macos,Notifications,Sleep,当我强制Mac进入睡眠状态时,我成功地获得了NSWorkspaceWillSleepNotification:但是,如果我的计算机在一定时间后自行进入睡眠状态(在“能量首选项”中指定),则不会发出此通知 有解决办法吗 正如我在评论中提到的,我已经能够在一些计算机上重现这一点,但在其他计算机上无法重现。通过快速调查,10.7.4似乎不会发送空闲睡眠通知,除非我也调用了IORegisterForSystemEmpower,但10.6.8会。因此,它可能是10.7中的一个bug。但是,由于我的测试非常

当我强制Mac进入睡眠状态时,我成功地获得了NSWorkspaceWillSleepNotification:但是,如果我的计算机在一定时间后自行进入睡眠状态(在“能量首选项”中指定),则不会发出此通知


有解决办法吗

正如我在评论中提到的,我已经能够在一些计算机上重现这一点,但在其他计算机上无法重现。通过快速调查,10.7.4似乎不会发送空闲睡眠通知,除非我也调用了IORegisterForSystemEmpower,但10.6.8会。因此,它可能是10.7中的一个bug。但是,由于我的测试非常简单,它也可能是特定硬件模型中的错误,或者与我没有想到的奇怪设置有关

另一方面,这可能是故意的行为,在这种情况下,我认为文档中有一个bug。虽然它没有直接说通知是针对空闲和强制睡眠发送的,但它确实暗示了这一点

NSWorkspace notifications参考(无法获取URL,因为developer.apple.com似乎已关闭…)说它是“在机器进入睡眠之前发布的”——不是“有时”或“仅用于强制睡眠”

QA1340(http://developer.apple.com/library/mac/#qa/qa1340/_index.html)讨论了这两种睡眠,并说Cocoa可以用来接收通知,而没有任何暗示它只适用于一种睡眠。它给出了应该可以工作的示例代码,这就是我用来重现问题的地方


我强烈建议您向苹果提交一份bug报告,将您的bug报告复制到,并在苹果的开发论坛上打开一个线程。而且,如果您是付费MDP成员,请在10.8DP4.1上试用,并在开发论坛的NDA部分中启动一个线程。如果10.8仍然损坏,您的雷达可能会导致苹果在最终发布之前修复,而如果没有人报告,则不太可能修复。

奇怪的是,NSWorkspaceWillSleepNotification不会因为空闲睡眠而被触发。。。您是否使用默认通知中心而不是NSWorkspace的通知中心进行归档(您需要使用后者进行归档)。否则,您可以设置I/O工具包睡眠/唤醒通知的回调(请参阅),我正在使用NSWorkspace的通知中心。我只是做了一个快速测试,在10.7.4上,空闲睡眠通知不会由NSWorkspace发送,除非有人调用IORegisterForSystemEmpower,而在10.6.8上,不管发生什么情况,都会被发送。现在,我只在少数几台机器上进行了测试,所以可能是硬件、系统设置、甚至其他一些名为IORegisterForSystemEmpower的应用程序的存在有所不同,所以不要过于相信细节。但至少可以肯定的是,有时通知无法发送。测试IORegisterForSystemEmpower是否解决了问题。如果IORegisterForSystemEmpower确实解决了问题,我会觉得,在编写了相关代码之后,您还不如使用它,而不必担心NSWorkspace通知。(这样,您可以区分强制睡眠和空闲睡眠等)QA1340中的代码可以复制并直接粘贴到Cocoa应用程序的-[AppDelegate ApplicationIDFinishLaunching:]中,只要您不使用CFRunLoopRun。感谢您(非常感谢)的帮助,我将查看IORegisterForSystemEnabled以获取记录,我刚刚尝试了QA1340中描述的Cocoa方法,它适用于空闲睡眠。你看,我也正处于使用该方法的阶段。你能解释一下你是怎么做的吗。我的应用程序是用Java编写的,我需要在每次Mac休眠和唤醒时收集数据。我有这段代码,但不知道如何将这段目标c代码用于java编码的应用程序。