Cocoa 在OSX上防止睡眠的正确方法是什么?

Cocoa 在OSX上防止睡眠的正确方法是什么?,cocoa,osx-lion,Cocoa,Osx Lion,可能重复: 在当前版本的OS X(10.7)上,防止应用程序或进程运行时睡眠的正确方法是什么 特别是,IOCancelPowerChange是否仍然(或曾经)用于此目的?我调用IOCancelPowerChange来响应kIOMessageCanSystemSleep,但这并没有起到作用 基本上,这一部分的第一部分之前已经被问过了,但它所指向的是非常旧的,答案从未被接受。IOCancelPowerChange继续工作,但仅适用于空闲触发的睡眠;它不适用于由Finder的睡眠菜单项触发的睡眠,

可能重复:

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

特别是,
IOCancelPowerChange
是否仍然(或曾经)用于此目的?我调用
IOCancelPowerChange
来响应
kIOMessageCanSystemSleep
,但这并没有起到作用



基本上,这一部分的第一部分之前已经被问过了,但它所指向的是非常旧的,答案从未被接受。

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

苹果回答了这样一个问题:“问:当电脑进入睡眠或从睡眠中醒来时,我的应用程序如何得到通知?我如何防止睡眠?”

清单2:

#导入
//kIOPMAssertionTypeNoDisplaySleep可防止显示休眠,
//kIOPMAssertionTypeNoIdleSleep可防止空闲睡眠
//reasonForActivity是系统在需要时使用的描述性字符串
//告诉用户系统为什么没有睡眠。例如
//“邮件压缩邮箱”将是一个有用的字符串。
//注意:IOPMAssertionCreateWithName将字符串限制为128个字符。
CFStringRef*reasonForActivity=CFSTR(“描述活动类型”);
IOPMAssertionID断言id;
IOReturn success=IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep,
KIOPMASSERTIONLEVEON、活动原因和断言ID);
if(success==kioreturnsucture)
{
//添加您不需要的工作
//系统睡在这里。
成功=IOPMAssertionRelease(断言ID);
//系统将能够再次休眠。
}
请注意,您只能停止空闲时间睡眠,而不能停止由用户触发的睡眠


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

您可以每30秒调用一次updatesystemActivity(OverallAct),以防止显示器休眠。

这有一个问题。@Michael:我也希望这样做。有什么办法可以修改这个问题吗?发布悬赏会提高这个问题的知名度,并可能会得到更多的答案。单击该问题上的
启动悬赏
链接,并提供所产生的对话框,其中包含您希望获得最新答案的原因。如果您想提供更多详细信息,请添加评论。@rax:任何人都可以建议对文章进行编辑。如果您希望,您关于
IOCancelPowerChange
的特定查询可能会独立存在。请避免使用此技巧。而是使用Q&A1340中记录的苹果认可的技术。为什么?苹果也在一份文件中建议使用这种方法。苹果在Q&A1340中的最新建议是使用新的IOPMAssertionCreateWithName接口。该接口避免了应用程序每30秒需要CPU周期,它为Mac OS X和其他工具提供了一种检查断言的简化方法,并更好地表明了应用程序的真实意图。告诉系统每30秒模拟一次用户活动是一个行之有效的技巧,但现在已经被正式的API所取代。
#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. 
}