objective c - suspensión - ¿Cómo evitar programáticamente que una Mac se quede dormida?
es malo dejar en reposo la mac (3)
Aquí está la documentación oficial de Apple (incluido el fragmento de código):
Preguntas y respuestas técnicas QA1340 - ¿Cómo puedo prevenir el sueño?
Cita: Impedir dormir utilizando el kit de E / S en 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.
}
Para versiones anteriores de OSX, verifique lo siguiente:
Preguntas y respuestas técnicas QA1160 - ¿Cómo puedo evitar que el sistema duerma mientras mi aplicación se está ejecutando?
Cita: Ejemplo de uso de UpdateSystemActivity (la forma canónica para <10.6)
#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);
}
¿Hay alguna manera de evitar que una Mac se quede dormida programáticamente usando Objective-C? La sección de fundamentos del kit de E / S en el sitio de desarrollo de Apple me dice que un controlador recibe una notificación de inactividad / inactividad del sistema, pero no puedo encontrar una manera de evitar que el sistema se quede dormido. ¿Es posible?
He encontrado otras soluciones usando Cafeína, jiggler, insomnio e incluso AppleScript, pero quiero hacer esto en Objective-C. Gracias.
La Q & A1340 de Apple reemplaza la Q & A1160. La última sesión de preguntas y respuestas responde a la pregunta "P: ¿Cómo se puede notificar a mi aplicación cuando la computadora se va a dormir o cuando se está despertando? ¿Cómo evito dormir?"
Listado 2 de 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.
}
Tenga en cuenta que solo puede detener el tiempo de inactividad y no el sueño activado por el usuario.
Para las aplicaciones compatibles con Mac OS X 10.6 y posterior, use la nueva familia de funciones IOPMAssertion . Estas funciones permiten que otras aplicaciones y utilidades vean el deseo de su aplicación de no dormir; esto es fundamental para trabajar a la perfección con el software de administración de energía de terceros.
Solo crea un NSTimer que active una función con este
UpdateSystemActivity(OverallAct);
Estoy bastante seguro de que eso es exactamente lo que hace la Cafeína.