防止OS X 10.8进入睡眠状态

时间:2012-10-08 13:56:59

标签: objective-c macos cocoa

我需要暂停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。

1 个答案:

答案 0 :(得分:3)

好吧,我找到了这种行为的解释。

在我发布断言后,OS X刚刚添加了powerd(超时300秒)进程的断言。因此,屏幕保护程序在我允许之后的5-6分钟内启动,而不是在1分钟之后(因为我在“系统偏好设置”中设置)。我真的不知道为什么。

我已经在github上更新了我的源代码,因此它打印出切换操作的所有断言。

正如有些人所说,OS X的这种奇怪行为出现在10.8。