Как программно предотвратить переход Mac в спящий режим? - PullRequest
26 голосов
/ 08 апреля 2011

Есть ли способ предотвратить программный переход Mac в режим сна с помощью Objective-C? В разделе «Основы набора I / O» на сайте разработчиков Apple говорится, что драйвер получает уведомление о бездействии / спящем режиме системы, но я не могу найти способ предотвратить спящий режим системы. Это вообще возможно?

Я сталкивался с некоторыми другими решениями, использующими кофеин, джигглер, бессонницу и даже AppleScript, но я хочу сделать это в Objective-C. Спасибо.

Ответы [ 3 ]

24 голосов
/ 08 апреля 2011

Вот официальная документация Apple (включая фрагмент кода):
Технические вопросы и ответы QA1340 - Как предотвратить сон?

Цитата: Предотвращение сна с помощью набора ввода / вывода в Mac OS X 10.6 Snow Leopard:

#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. 
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. 
}

Для более старой версии OSX проверьте следующее:
Технические вопросы и ответы QA1160 - Как я могу предотвратить спящий режим системы во время работы моего приложения?

Цитата: Пример использования UpdateSystemActivity (канонический способ для <10.6) </p>

#include <CoreServices/CoreServices.h>

void
MyTimerCallback(CFRunLoopTimerRef timer, void *info)
{
    UpdateSystemActivity(OverallAct);
}


int
main (int argc, const char * argv[])
{
    CFRunLoopTimerRef timer;
    CFRunLoopTimerContext context = { 0, NULL, NULL, NULL, NULL };

    timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent(), 30, 0, 0, MyTimerCallback, &context);
    if (timer != NULL) {
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes);
    }

    /* Start the run loop to receive timer callbacks. You don't need to
    call this if you already have a Carbon or Cocoa EventLoop running. */
    CFRunLoopRun();

    CFRunLoopTimerInvalidate(timer);
    CFRelease(timer);

    return (0);
}
9 голосов
/ 11 декабря 2011

Apple Q & A1340 заменяет Q & A1160. Последние вопросы и ответы отвечают на вопрос: «Как мое приложение может получать уведомления, когда компьютер спит или просыпается? Как мне предотвратить сон?»

Листинг 2 из Q & A1340 :

#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. 
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. 
}

Обратите внимание, что вы можете остановить только простой сон, но не сон, вызванный пользователем.

Для приложений, поддерживающих Mac OS X 10.6 и более поздние версии, используйте новое семейство функций IOPMAssertion . Эти функции позволяют другим приложениям и утилитам видеть желание вашего приложения не спать; это очень важно для бесперебойной работы с программным обеспечением для управления питанием сторонних производителей.

4 голосов
/ 08 апреля 2011

Просто создайте NSTimer, который запускает функцию с этим

UpdateSystemActivity(OverallAct);

Я уверен, что это именно то, что делает кофеин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...