我需要暂停OS X运行屏幕保护程序一段时间,然后允许它。我发现IOKit的函数IOPMAssertionCreateWithName和IOPMAssertionRelease,但它们没有按预期工作。创建断言后,屏幕保护程序被阻止,没关系,但即使在我发布断言后它仍然被阻止。这是我在github上的一些示例代码:https://github.com/silvansky/OSX-TestSleep - 主要方法是这样的:
- (IBAction)toggle:(id)sender
{
if (_assertionID == kIOPMNullAssertionID)
{
// toggle on
CFStringRef reasonForActivity= CFSTR("Test reason");
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &_assertionID);
[self.statusField setStringValue:@"Assert ON"];
NSLog(@"*** lock: %d, success: %d", _assertionID, success);
}
else
{
// toggle off
IOReturn success = IOPMAssertionRelease(_assertionID);
[self.statusField setStringValue:@"Assert OFF"];
NSLog(@"*** unlock: %d. success: %d", _assertionID, success);
_assertionID = kIOPMNullAssertionID;
}
}
因此,当我第二次按下“切换”按钮时,屏幕保护程序仍然被阻止。
有没有办法解决这个问题?我的系统是OS X 10.8.2,Xcode 4.5.1。
答案 0 :(得分:3)
好吧,我找到了这种行为的解释。
在我发布断言后,OS X刚刚添加了powerd(超时300秒)进程的断言。因此,屏幕保护程序在我允许之后的5-6分钟内启动,而不是在1分钟之后(因为我在“系统偏好设置”中设置)。我真的不知道为什么。
我已经在github上更新了我的源代码,因此它打印出切换操作的所有断言。
正如有些人所说,OS X的这种奇怪行为出现在10.8。