我需要让 OS X 暂时停止运行屏幕保护程序,然后允许它运行。我找到了 IOKit 的函数 IOPMAssertionCreateWithName 和 IOPMAssertionRelease,但它们没有按预期工作。创建 Assertion 后,屏保被屏蔽了,没关系,但是我释放 Assertion 后它仍然被屏蔽。这是我在 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。