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;
}
}
そのため、2回目に「トグル」ボタンを押しても、スクリーンセーバーはブロックされたままです。
それを修正する方法はありますか?私のシステムはOSX10.8.2、Xcode4.5.1です。