Activar el evento de agitación con activación progtwigda

¿Cómo puedo activar el evento Shake en iOS mediante progtwigción?

He intentado lo siguiente pero sigue fallando …

+ (void)shake { NSLog(@"TEST"); UIMotionEventProxy *m = [[NSClassFromString(@"UIMotionEvent") alloc] _init]; m->_subtype = UIEventSubtypeMotionShake; m->_shakeState = 1; [[[UIApplication shanetworkingApplication] keyWindow] motionBegan:UIEventSubtypeMotionShake withEvent:m]; [[[UIApplication shanetworkingApplication] keyWindow] motionEnded:UIEventSubtypeMotionShake withEvent:m]; } 

¿Qué hace Apple en el simulador en Hardware > Shake Gesture ?

Cambiar la class UIMotionEventProxy (agregar dos methods setter) parecía hacer el truco. Simplemente agregué dos methods setShakeState y _setSubtype , que se muestran a continuación.

 -(void)setShakeState:(int)fp8 { _shakeState = fp8; } -(void)_setSubtype:(int)fp8 { _subtype = fp8; } 

Luego cambié mi código por el siguiente …

 UIMotionEventProxy *m = [[NSClassFromString(@"UIMotionEvent") alloc] _init]; [m setShakeState:1]; [m _setSubtype:UIEventSubtypeMotionShake]; [[UIApplication shanetworkingApplication] sendEvent:m]; [[[UIApplication shanetworkingApplication] keyWindow] motionBegan:UIEventSubtypeMotionShake withEvent:m]; [[[UIApplication shanetworkingApplication] keyWindow] motionEnded:UIEventSubtypeMotionShake withEvent:m]; 

Parece funcionar sin problemas tanto para el simulador como para el dispositivo físico. Aquí hay files principales y de cabecera disponibles para download si alguien quiere ver los files completos de UIMotionEventProxy.

Tratar de replace

UIMotionEventProxy *m = [[NSClassFromString(@"UIMotionEvent") alloc] _init];

con

UIMotionEventProxy *m = [[UIMotionEventProxy alloc] _init];

Supongo que está aplastando cuando NSClassFromString(@"UIMotionEvent") devuelve cero.

¿Quieres usar la aplicación Jailbreak o el uso compatible con Apple?

Para su pregunta sobre el simulador, Apple usa una function privada.

Aquí hay una pequeña explicación:

Cuando usa "Shake Gesture", la llamada del simulador sendButtonEvent: 0x3fc

sendButtonEvent es una function en Simulator, que:

  • get frontmostAppPort
  • envíe un post vía sendPurpleEvent o HIDEvent

En una aplicación jailbreak, puede hacer algo como (no probado, pero debería funcionar):

 struct UIEvent { int subtype; double timestamp; int type; } * event; bzero(event, sizeof(event)); event->type = UIEventTypeMotion; event->subtype = UIEventSubtypeMotionShake; event->timestamp = GSCurrentEventTimestamp(); NSString* bundle = [[NSBundle mainBundle] bundleIdentifier]; mach_port_t port = GSCopyPurpleNamedPort([bundle UTF8String]); GSEventRecord* record = (GSEventRecord*)event; GSSendEvent(record, port); 
Intereting Posts