2011-04-22 17 views
9

Estoy construyendo una aplicación Mac OSX que necesita sondear un servidor cada minuto, o incluso menos si el usuario lo desea. Por desgracia, el servicio no es compatible con empuje ...Mac - Obtener estado de carga/batería (enchufado o no)

De todas formas, me gustaría ofrecer dos opciones para el usuario: intervalo de

  1. sondeo en sondeo de la batería
  2. intervalo durante la carga

¿Cómo obtendré el estado del cargador en Objective C? Realmente no me importa el porcentaje real, solo si la laptop está enchufada o no. Obviamente, esto no tiene importancia para los equipos de sobremesa, por lo que esperamos que haya una solución que funcione para computadoras portátiles y de escritorio.

Respuesta

14

Eche un vistazo a la API IOPowerSources.

Primera llamada IOPSCopyPowerSourcesInfo(), luego IOPSCopyPowerSourcesList() para obtener una lista de todas las fuentes de alimentación disponibles. IOPSGetPowerSourceDescription() devolverá un diccionario con información sobre una fuente de alimentación particular. Según la documentación, la clave kIOPSPowerSourceStateKey describe "la fuente de energía actual. kIOPSBatteryPowerValue indica que la fuente de alimentación consume energía interna; kIOPSACPowerValue indica que la fuente de alimentación está conectada a una fuente de alimentación externa".

También puede configurar una notificación cuando las fuentes de alimentación cambien con IOPSNotificationCreateRunLoopSource().

(NB:. No he probado nada de esto, se limitó a la documentación)

+4

'IOPSCopyExternalPowerAdapterDetails()' parece ser un mejor partido: ' Si no hay un adaptador (de CA/alimentación externa) conectado, o si hay un error, devuelve 'NULL'. ' –

+0

¡Muchas gracias! –

6

Aunque esta pregunta tiene ya una respuesta aceptada que me llevó a mi solución, que era doloroso para hacer clic a través de las porciones y muchos enlaces rotos.

Aquí está mi solución:

  1. Añadir IOKit.framework
  2. importación #import <IOKit/ps/IOPowerSources.h>
  3. Código:

    CFTimeInterval timeRemaining = IOPSGetTimeRemainingEstimate(); 
    
    if (timeRemaining == kIOPSTimeRemainingUnlimited) { 
         // connected to outlet 
    } else if (timeRemaining == kIOPSTimeRemainingUnknown){ 
         // time remaining unknown (recently unplugged) 
    } else if ((timeRemaining/60) < 30){ 
         // less than 30 minutes remaining 
    } 
    
+0

-2 (cargador enchufado) y -1 cargador desenchufado o le dará segundos de duración de la batería –

+1

Esto funcionó perfectamente para mí y fue mucho más claro. – Volomike

Cuestiones relacionadas