Блокировка от пробуждения для Mac OS X

В Android есть блокировка, чтобы держать экран включенным. Итак, есть ли эквивалент Mac, чтобы держать экран включенным для ПК под управлением Mac OS X? Если это так, каковы API?

1 ответ

Решение

Да, в OS X это делается на уровне ОС через IOPMLibподсистема управления питанием, которая также является подсистемой, которая контролирует AppNap под OS X Mavericks.

Вот пример того, что мы делаем при выполнении тяжелых вычислений. В нашем случае мы сохраняем процессор в спящем режиме, но вы можете предотвратить его отключение с помощью kIOPMAssertionTypePreventUserIdleDisplaySleep где мы использовали kIOPMAssertionTypePreventUserIdleSystemSleep,

@property IOPMAssertionID currentPowerAssertion;


- (void)assertPowerRequirement:(NSString*)reason
{
    // don't re-assert if we're already here
    if (_currentPowerAssertion)
        return;

    IOPMAssertionID assertionID;

    IOReturn success = IOPMAssertionCreateWithName( 
            kIOPMAssertionTypePreventUserIdleSystemSleep,   // prevent CPU from going to sleep 
            kIOPMAssertionLevelOn,                          // we are turning this on
            (__bridge CFStringRef)reason,                   // here's why
            &assertionID);                                  // reference for de-asserting

    if (success == kIOReturnSuccess) {
        _currentPowerAssertion = assertionID;
    } else {
        NSLog(@"Power assert failed");
    }
}

- (void)deassertPowerRequirement
{
    if (!_currentPowerAssertion)
        return;

    IOReturn success = IOPMAssertionRelease(_currentPowerAssertion);
    if (success !=kIOReturnSuccess) {
        NSLog(@"Power de-assert failed");
    }

    _currentPowerAssertion = 0;
}

В этом случае это в нашем делегате приложения, и у нас есть currentPowerAssertion свойство отслеживать. Поскольку мы используем только одно состояние утверждения и только для одной цели, мы используем один механизм хранения. Тем не менее, вы можете утверждать несколько раз из разных частей вашей программы, если вы уравновешиваете утверждения с де-утверждениями и используете соответствующие reason, Спецификации Apple требуют указания причины (не NULL) и предлагают, чтобы имя и задача приложения были описаны в утверждении.

Важно удостовериться, что вы де-утверждаете, когда вам это больше не нужно, хотя утверждения хранятся для каждого отдельного приложения, поэтому при выходе из вашего приложения они автоматически удаляются.

Чтобы добавить к этому, есть также инструменты командной строки, такие как встроенный caffeinate.

Другие вопросы по тегам