Forzar la pantalla de locking

Estoy intentando bloquear automáticamente el dispositivo después de un período de time determinado. Lo único que he visto que haría esto posible es hacerlo:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. UIApplication.shanetworkingApplication().idleTimerDisabled = true NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: "lockScreen", userInfo: nil, repeats: false) return true } func lockScreen() { print("locking screen") UIApplication.shanetworkingApplication().idleTimerDisabled = false } 

Sin embargo, no parece funcionar. ¿Hay otras alternativas? Hay una aplicación en el mercado llamada CellControl que hace esto, así que sé que es posible, simplemente no puedo entender cómo.

También he intentado en obj-c tomado de esta respuesta

Aquí hay un clip de la aplicación que funciona, que se descarga de la tienda de aplicaciones públicas. Puedes ver que tan pronto como presiono el button de inicio y salgo de la aplicación, obligan a bloquear la pantalla.

introduzca la descripción de la imagen aquí

También he visto el uso de frameworks privados que definitivamente llamarían al rechazo:

 char *gsDylib = "/System/Library/PrivateFrameworks/GraphicsServices.framework/GraphicsServices"; void *handle = dlopen(gsDylib, RTLD_NOW); if (handle) { BOOL locked = FALSE; void (*_GSEventLockDevice)() = dlsym(handle, "GSEventLockDevice"); if (_GSEventLockDevice) { _GSEventLockDevice(); //... } dlclose(handle); //... } 

Al iniciar la aplicación por primera vez, solicitan permiso para:

  • Haga que los datos estén disponibles para dispositivos bluetooth incluso cuando no usa la aplicación
  • Enviar notifications push
  • Contactos de acceso
  • Micrófono de acceso
  • Usa la location incluso cuando no utilices la aplicación.

No sé si alguno de estos frameworks te daría la posibilidad de bloquear la pantalla, ¿pero quizás? …


Actualización rápida:

Después de más investigaciones y una gran ayuda de JBA, me estoy acercando a una solución. Parece que Cell Control está actuando como un periférico de keyboard que les permite enviar un command para bloquear la pantalla. Entonces compré un keyboard bluetooth para intentar adivinar qué … funciona como encanto. Soy capaz de bloquear y desbloquear mi dispositivo. Así que conecté el keyboard a mi Mac (a través de Bluetooth) para oler los packages. Este evento se registra cuando se presiona el button de locking en el keyboard:

introduzca la descripción de la imagen aquí

Por lo que puedo decir (de ninguna manera soy un experto en esto), es que para activar un locking, todo lo que envía es un evento de mouse con todos los datos de events a cero. Además, tampoco presiona ningún button. Mi objective es replicar esto en Arduino … así que hay más trabajo por hacer.

Si quieres saber cómo lo hacen:

El teléfono está emparejado con el dispositivo bluetooth incluido en su hardware. Si comtesting más, notará que este dispositivo Bluetooth tiene el perfil de "Teclado": simplemente compruebe su teléfono, verá que es reconocido como un keyboard inalámbrico … Interesante … ¿Viene la respuesta? …

Tu apuesto El dispositivo envía al teléfono la tecla de command de la pantalla de locking como si se tratara de un keyboard Bluetooth conectado (sí, porque un keyboard BT puede hacerlo). Y aquí tienes.

=== EDIT ===

Por favor, eche un vistazo a esta tabla de uso de HID , encontrará algunos códigos de command útiles. Los códigos key que estamos buscando son probablemente 0x81 o 0x82 .

Después de ponerse en contacto con el Soporte técnico para desarrolladores de Apple, no hay una forma compatible para lograr esta funcionalidad sin usar API privadas. El uso de estos hará que su aplicación sea rechazada.

Mi conjetura es que CellControl pudo hacerlo a través de la revisión porque la única manera de que hagan uso de esta característica es si tiene su hardware instalado en su vehículo, el dispositivo se combina con él y comienza a conducir. Mi conjetura es que durante la revisión de la aplicación, Apple no compró uno de sus dispositivos y realmente lo testing. Aunque siempre he tenido la printing de que escanean sus files binarys para verificar el uso indocumentado de API, pero eso parece estar mal.

La otra posibilidad como @Chris mencionó es que podrían haber tenido un acuerdo con Apple antes de comenzar el desarrollo. Si bien esto parece improbable, es posible.

Aquí hay algunos extractos del Soporte técnico para desarrolladores de Apple:

Gracias por comunicarse con el Soporte técnico para desarrolladores de Apple (DTS). Nuestros ingenieros han revisado su request y han llegado a la conclusión de que no existe una forma compatible para lograr la funcionalidad deseada dadas las configuraciones del sistema de envío actual.


Hola,

El Soporte técnico del desarrollador no está en condiciones de revertir el software de otro desarrollador en su nombre. Las aplicaciones que están haciendo cosas aparentemente imposibles generalmente se dividen en una de dos categorías:

  • están rompiendo las reglas y App Review aún no las ha capturado (A)

  • su material de marketing es económico con la verdad (B)

Puedo decir que no hay una forma compatible de bloquear el dispositivo desde su aplicación iOS.


Espero que esto ayude a alguien en el futuro.