Detecta / apaga la pantalla desde el servicio de iOS

Estoy desarrollando una aplicación de monitor de red que se ejecuta en segundo plano como un servicio. ¿Es posible recibir una notificación / llamada cuando la pantalla está encendida o apagada?

Existe en Android usando el siguiente código:

private void registerScreenOnOffReceiver() { IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(screenOnOffReceiver, filter); } 

Luego, se llama a screenOnOffReceiver cuando la pantalla se enciende / apaga. ¿Hay una solución similar para iOS?

Editar: Lo mejor que he encontrado hasta ahora es UIApplicationProtectedDataWillBecomeUnavailable ( Detectar si la pantalla del iPhone está encendida / apagada ) pero requiere que el usuario habilite Protección de datos (protección con contraseña) en el dispositivo.

Puede usar las notificaciones de Darwin para escuchar los eventos. No estoy 100% seguro, pero me parece que, de ejecutar en un iPhone 4 con iOS 5.0.1 con jailbreak, uno de estos eventos podría ser lo que necesitas:

 com.apple.iokit.hid.displayStatus com.apple.springboard.hasBlankedScreen com.apple.springboard.lockstate 

Actualización: también, la siguiente notificación se publica cuando el teléfono se bloquea (pero no cuando se desbloquea):

 com.apple.springboard.lockcomplete 

Para usar esto, regístrese para el evento de esta manera (esto se registra solo para un evento, pero si eso no funciona para usted, intente con los demás):

 CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center NULL, // observer displayStatusChanged, // callback CFSTR("com.apple.iokit.hid.displayStatus"), // event name NULL, // object CFNotificationSuspensionBehaviorDeliverImmediately); 

donde displayStatusChanged es su callback de evento:

 static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) { NSLog(@"event received!"); // you might try inspecting the `userInfo` dictionary, to see // if it contains any useful info if (userInfo != nil) { CFShow(userInfo); } } 

Si realmente quieres que este código se ejecute en segundo plano como un servicio , y estás jailbroken, te recomendaría buscar en iOS Launch Daemons . A diferencia de una aplicación que simplemente dejas ejecutar en segundo plano, un demonio de inicio puede iniciarse automáticamente luego de reiniciarse, y no tienes que preocuparte por las reglas de iOS para las aplicaciones que ejecutan tareas en segundo plano.

¡Háganos saber cómo funciona esto!

Con la API de notificación de nivel inferior, puede consultar el estado de locking cuando se recibe una notificación:

 #import  int notify_token; notify_register_dispatch("com.apple.springboard.lockstate", &notify_token, dispatch_get_main_queue(), ^(int token) { uint64_t state = UINT64_MAX; notify_get_state(token, &state); NSLog(@"com.apple.springboard.lockstate = %llu", state); }); 

Por supuesto, su aplicación tendrá que iniciar UIBackgroundTask para obtener las notificaciones, lo que limita la utilidad de esta técnica debido al tiempo de ejecución limitado permitido por iOS.

Mientras la pantalla del iPhone está bloqueada, el método de delegar la aplicación “- (void) applicationWillResignActive: (aplicación de UIAplicación) se llamará. Puedes verificar eso. Espero que te pueda ayudar.