我正在开发沙盒应用。我希望安排电源事件(通过IOPMSchedulePowerEvent
),允许应用程序让Mac进入睡眠状态并在规定的时间将其唤醒,同时保留应用程序沙箱。
目前,我可以使IOPMSchedulePowerEvent工作的唯一方法是将应用程序作为“root”运行并取消启用沙箱。这是通过执行我以前的一篇文章here
中的步骤来实现的是否有临时例外权利允许我在保留应用程序沙箱的同时安排这些电源事件而不是强制应用程序以root身份运行?到目前为止,我最接近找到解决方案的是here。我承认,我在处理临时例外权利方面相当缺乏经验,所以提供的任何见解都会非常有用!
是从com.apple.security.temporary-exception.iokit-user-client-class
权利开始的适当位置开始的吗?一旦权利包含在权利文件中,我将如何实际使用权利?
编辑我认为我找到了一个运作良好的解决方法。我完全离开了调度电源事件/权利路由,而是使用kIOPMAssertionTypeNoIdleSleep
防止空闲睡眠,同时仍允许显示器休眠。这种逻辑重做更简单,并且完成了我之前尝试实现的相同目标。显示相关文档的Stack Overflow帖子为here。
以下是代码的副本,加上我添加的一些额外内容以删除一些警告/弃用:
#import <IOKit/pwr_mgt/IOPMLib.h>
// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep
// reasonForActivity is a descriptive string used by the system whenever it needs
// to tell the user why the system is not sleeping. For example,
// "Mail Compacting Mailboxes" would be a useful string.
// NOTE: IOPMAssertionCreateWithName limits the string to 128 characters.
// Do what we need to with the string types
NSString *reasonForActivity = @"Put Display to Sleep, Keep Machine Awake";
CFStringRef cfStringReasonForActivity = (__bridge CFStringRef)reasonForActivity;
IOPMAssertionID assertionID;
// create assertion to prevent system from IDLE sleeping
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep,
kIOPMAssertionLevelOn, cfStringReasonForActivity, &assertionID);
if (success == kIOReturnSuccess)
{
// Add the work you need to do without
// the system sleeping here.
success = IOPMAssertionRelease(assertionID);
// The system will be able to sleep again.
}