2011-02-10 12 views
5

Me gustaría despertar programáticamente una Mac. Comencé utilizando IOPMSchedulePowerEvent, sin embargo, ese método requiere acceso de administrador y ayudantes privilegiados. Lo he implementado y funciona, pero es demasiado complicado.¿Cómo programáticamente programar el despertar del sistema usando las preferencias del sistema en una Mac?

He buscado un mejor enfoque y descubrí que puede programar el sistema para que se active yendo a, Preferencias del sistema -> Ahorro de energía -> Programar. ¿Hay alguna manera de programar programáticamente una hora de despertar usando este método?

Gracias.

Editar: Entiendo que el sistema requiere acceso de administrador para programar la activación del sistema y el tiempo de suspensión. Es correcto. Me gustaría poder hacer esto programáticamente. Hacer que el usuario autorice la funcionalidad está bien, siempre que solo se le pregunte una vez. Las solicitudes posteriores para configurar el tiempo de reactivación del sistema no deberían requerir la autorización del usuario.

Respuesta

2

El uso de IOPMSchedulePowerEvent es lo correcto. Sin embargo, si crea una herramienta de ayuda privilegiada, solo necesita solicitar una vez al usuario su contraseña. El código de Apple BetterAuthorizationSample proporciona un ejemplo de cómo hacer esto; también hay una modificación de terceros, AuthorizedTasksInCocoa, que puede ser un poco más fácil de usar (no lo he probado).

+0

@Nicholas, ya he implementado un ayudante usando BAS, sin embargo, BAS usa launchd para ejecutar el helper. Al hacerlo, launchd requiere que el daemon auxiliar se instale en/Library/LaunchDaemons. Esta es la forma aprobada por Apple, pero para la tienda de aplicaciones Mac, a Apple no le gusta porque rompe una de sus reglas sobre la ubicación del archivo de la aplicación de archivos. – David

+1

Sí, no puedes hacer esto si quieres enviarlo a la Mac App Store. Esto es por diseño y no hay forma de evitarlo.Presenta un error con Apple si esto es un problema para ti y quizás, algún día, ellos cambien las reglas. (Otras aplicaciones que usan autorización tienen versiones separadas para Mac App Store que eliminan la función de autorización). –

+0

Bien, sé que es posible despertar el sistema de suspensión porque hay aplicaciones de alarma en la tienda que lo hace (ej. Aurora). La aplicación Aurora requiere una autenticación de administrador y utiliza una herramienta de ayuda para activar el sistema. No entiendo cómo pueden obtener una forma de no usar launchd. – David

0

Estoy bastante seguro de que se pretende que requiera acceso de administrador. Por ejemplo, las opciones en Preferencias del sistema -> Ahorro de energía -> Programa no están disponibles a menos que haya iniciado sesión como administrador o se haya autenticado en Preferencias del sistema como administrador. Si encontraba una forma de hacerlo sin ningún privilegio especial, esperaría que Apple lo considerara un error de seguridad y lo solucionara (lo que interrumpiría su programa).

+0

ok se requiere el acceso de administrador, pero ¿conoces una forma de acceder programáticamente al planificador de suspensión y activación del sistema? – David

1

que no tienen una respuesta completa para usted, pero esto debería ayudar enormemente: http://www.opensource.apple.com/source/PowerManagement/PowerManagement-211/pmset/pmset.c

Lo que usted querrá hacer es programar una kIOPMAutoWake. Encuentre esa constante (no una variación de la misma) en el código y comience a leer. No es TAN largo.

Probablemente pueda incluso usar pmset directamente, pero eso sería bastante poco elegante.

En cuanto a la elevación, Apple habla de ello en Secure Coding Guide.

0

Puede programar eventos de despertador con IOPMSchedulePowerEvent a través del administrador de energía. Puede programar un despertar inmediato. pmset es un contenedor de línea de comando para el administrador de energía. También puede evitar el reposo con IOCancelPowerChange en ciertos casos.

Puede evitar la suspensión o la activación generando un mouse o un evento clave. Una forma de generar eventos es con CGPostKeyboardEvent.

==> El modo de reposo normal es diferente del modo de reposo cerrado. Para afectar a este último debes escribir una extensión del kernel como Insomnia.

Cuestiones relacionadas