2

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です。

4

1 に答える 1

3

さて、私はそのような振る舞いの説明を見つけました。

OS Xは、アサーションを解放した後、powered(タイムアウト300秒)プロセスのアサーションを追加しました。したがって、スクリーンセーバーは、(システム環境設定で設定したように)1分後ではなく、許可してから5〜6分で開始します。理由はよくわかりません。

githubでソースを更新したので、トグルアクションのすべてのアサーションが出力されます。

一部の人々が言うように、OSXのこの奇妙な振る舞いは10.8に現れました。

于 2012-10-09T07:36:49.930 に答える