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.
}
電源アサーションは、ユーザーが明示的にスリープをトリガーする (例: ふたを閉じるか、 メニューで選択する) か、システムがバッテリ電源で動作している場合にオーバーライドできます。
コードの動作に問題がありますか?