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