iphone - pantalla - itunes
Inyectar eventos táctiles de ancho en el sistema en iOS7 (3)
Antes de iOS7 era posible inyectar eventos táctiles con las GSSendEvent
la API privada GSSendSystemEvent
y GSSendEvent
, por ejemplo:
- GSSendEvent - Inject Touch Event iOS
- Simulación de eventos Wide Touch del sistema en iOS
- Simulación de tap en todo el sistema en iOS
- Envía un evento táctil global en iOS 6
Sin embargo, en iOS7 estas llamadas parecen fallar silenciosamente. Se ha sugerido una alternativa para Simular toques de todo el sistema en iOS 7, pero solo funciona en dispositivos jailbreak. https://github.com/kif-framework/KIF se parece a otra opción, pero parece que solo admite inyectar eventos para la aplicación actual en lugar de para todo el sistema (por lo que no podría inyectar un evento táctil mientras está en la aplicación) está en el fondo, por ejemplo).
Entonces, ¿cómo puede inyectar eventos táctiles de todo el sistema en iOS7, sin jailbreak?
Puede subclase UIWindow y sobrescribir sendEvent. Lo uso para implementar un patrón de múltiples oyentes, pero también puedes usarlo para disparar eventos ...
- (void)sendEvent:(UIEvent*)event {
[super sendEvent:event];
//NSLog(@"NSEventListenerWindow.sentEvent: %@/n", event);
// pass all events on to those who listen
for ( id listener in listeners) {
if ([listener respondsToSelector:@selector(sendEvent:)]) {
[listener sendEvent:event];
}
}
.....
Creo que sería mejor que utilizaras la aplicación del servicio de notificación SDK de iOS. Esa sería la forma más limpia de lograr lo que quieres.
Conceptualmente, Apple no (todavía) tiene la intención de que terceros emitan eventos en todo el sistema, ya que eso no encajaría bien con el modelo de comisariado cuidadoso de iOS, es por eso que las personas recurren a las API privadas y al jailbreaking. Se supone que no se debe confiar en las API privadas, como su nombre lo indica.
Piénselo de esta manera, a menos que usted sea responsable de todo el sistema, lo que una aplicación de usuario no podría ser, realmente no tiene ningún negocio que genere eventos en todo el sistema. Sé cómo Android hace esto, pero esa es otra historia (no apta para este tema).
En Mac, la aplicación XPC Services permite que los procesos se comuniquen entre sí, y aún no es un método para generar todo el evento del sistema. Te sugiero que uses la API de notificaciones de iOS SDK, que probablemente sea el método más limpio para lograr lo que quieres. Sí, va a Apple y vuelve al dispositivo, pero ese es el mecanismo que está disponible hasta ahora.
¿Supongo que necesita hacer esto en todo el sistema para un escenario de prueba? En ese caso, podría estar bien atendido por el marco de automatización de UI de Apple, una herramienta basada en JavaScript útil para las pruebas en el dispositivo.
Si bien no puedes hacer cosas como simular presionar un botón de inicio, puedes enviar tu aplicación al fondo por un tiempo específico, por ejemplo:
UIATarget.localTarget().deactivateAppForDuration(seconds);
Aquí están los documentos:
https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef