4

kIOPMAssertionTypeNoIdleSleepkIOPMAssertionTypePreventSystemSleepはどう違いkIOPMAssertionTypePreventUserIdleSystemSleepますか?

Mac が自動的にスリープ状態にIOPMAssertionならないようにする を作成しようとしていますが、どれを使用すればよいかわかりません。私はそれらの説明に混乱しており、それらを理解できません (これについてはドキュメントを参照してください)。

興味がある場合は、これがコードでの方法です。

IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, CFSTR("My app is running"), &preventSleepAssertionID);

if (success != kIOReturnSuccess) {
    NSLog(@"Could not create sleep prevention assertion");
}
4

2 に答える 2

1

Apple はこの件に関するQ&A ノートを公開しており、あなたの質問に答えていると思います。問題のコード例の主なコメント:

// 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. 
CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, 
                                    kIOPMAssertionLevelOn, reasonForActivity, &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. 
}

電源アサーションは、ユーザーが明示的にスリープをトリガーする (例: ふたを閉じるか、 メニューで選択する) か、システムがバッテリ電源で動作している場合にオーバーライドできます。

コードの動作に問題がありますか?

于 2013-07-20T15:48:15.113 に答える