什么是防止OS X睡眠的正确方法?

oro*_*ome 13 cocoa osx-lion

可能重复:
如何以编程方式阻止Mac进入睡眠状态?

当前版本的OS X(10.7)在应用程序或进程运行时防止睡眠的正确方法是什么?

特别是,IOCancelPowerChange仍然(或曾经)曾为此目的服务吗?我打电话IOCancelPowerChange回应kIOMessageCanSystemSleep,但这并没有成功.


基本上与此问题的第一部分相同的问题之前已被问过,但它指出的文档很老,答案从未被接受.

Gra*_*iln 13

IOCancelPowerChange继续工作但仅限于空闲触发的睡眠; 它不适用于由Finder的Sleep菜单项触发的睡眠,以编程方式请求,或按下电源按钮.

Apple的Q&A1340回答了一个问题:问:当计算机进入睡眠状态或从睡眠中醒来时,我的应用程序如何得到通知?我该如何预防睡眠?

Q&A1340的清单2 :

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep

//reasonForActivity is a descriptive string used by the system whenever it needs 
//  to tell the user why the system is not sleeping. For example, 
//  "Mail Compacting Mailboxes" would be a useful string.

//  NOTE: IOPMAssertionCreateWithName limits the string to 128 characters. 
CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, 
                                    kIOPMAssertionLevelOn, reasonForActivity, &assertionID); 
if (success == kIOReturnSuccess)
{

    //Add the work you need to do without 
    //  the system sleeping here.

    success = IOPMAssertionRelease(assertionID);
    //The system will be able to sleep again. 
}
Run Code Online (Sandbox Code Playgroud)

请注意,您只能停止空闲时间睡眠,而不能停止用户触发睡眠.

对于支持Mac OS X 10.6及更高版本的应用程序,请使用新的IOPMAssertion系列函数.这些功能允许其他应用程序和实用程序看到您的应用程序不想睡觉的愿望; 这对于与第三方电源管理软件无缝协作至关重要.