2

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

4

1 回答 1

3

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

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

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

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

于 2012-10-09T07:36:49.930 回答