Mac OS X的唤醒锁定

时间:2014-04-04 22:50:20

标签: android macos wakelock

在Android中,有唤醒锁定以保持屏幕开启。那么,Mac是否相当于为运行Mac OS X的PC保持屏幕?如果是这种情况,那么API是什么?

2 个答案:

答案 0 :(得分:1)

是的,在OS X中,它通过电源管理子系统IOPMLib在操作系统级别完成,该子系统也是在OS X Mavericks下控制AppNap的子系统。

这是我们在执行繁重计算时所做的一个示例。在我们的示例中,我们会让CPU保持睡眠状态,但您可以使用kIOPMAssertionTypePreventUserIdleDisplaySleep使用kIOPMAssertionTypePreventUserIdleSystemSleep来阻止显示屏进入休眠状态。

@property IOPMAssertionID currentPowerAssertion;


- (void)assertPowerRequirement:(NSString*)reason
{
    // don't re-assert if we're already here
    if (_currentPowerAssertion)
        return;

    IOPMAssertionID assertionID;

    IOReturn success = IOPMAssertionCreateWithName( 
            kIOPMAssertionTypePreventUserIdleSystemSleep,   // prevent CPU from going to sleep 
            kIOPMAssertionLevelOn,                          // we are turning this on
            (__bridge CFStringRef)reason,                   // here's why
            &assertionID);                                  // reference for de-asserting

    if (success == kIOReturnSuccess) {
        _currentPowerAssertion = assertionID;
    } else {
        NSLog(@"Power assert failed");
    }
}

- (void)deassertPowerRequirement
{
    if (!_currentPowerAssertion)
        return;

    IOReturn success = IOPMAssertionRelease(_currentPowerAssertion);
    if (success !=kIOReturnSuccess) {
        NSLog(@"Power de-assert failed");
    }

    _currentPowerAssertion = 0;
}

在这种情况下,这是在我们的App委托中,我们有currentPowerAssertion属性来跟踪。由于我们只使用一个断言状态并且仅用于一个目的,因此我们使用单个存储机制。但是,只要使用解除断言来平衡断言并使用适当的reason,就可以从程序的不同部分多次断言。 Apple的规范要求给出一个原因(不是NULL),并建议在断言中描述应用程序名称和任务。

尽管断言是按应用程序保留的,但确保在不再需要时断言是非常重要的,因此当您的应用程序退出时,它们将自动被取消断言。

答案 1 :(得分:1)

要添加到其中,还有一些命令行工具,例如内置的caffeinate