以编程方式触发摇动事件iOS

我如何以编程方式触发iOS中的摇动事件?

我试过以下,但它不断崩溃…

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

Hardware > Shake Gesture下的模拟器中,苹果有什么function?

更改UIMotionEventProxy类(添加两个setter方法)似乎有诀窍。 我只是添加了两个方法setShakeState_setSubtype ,如下所示。

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

然后,我改变了我的代码如下…

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

似乎是完美的工作模拟器和物理设备。 如果有人想查看完整的UIMotionEventProxy文件,可以下载主文件和头文件。

尝试更换

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

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

我猜这是在NSClassFromString(@"UIMotionEvent")返回nil时NSClassFromString(@"UIMotionEvent")

你想使用越狱应用程序或苹果兼容使用?

对于你的模拟器的问题,苹果使用私人function。

这里是一个小解释:

当你使用“Shake Gesture”时,模拟器调用sendButtonEvent:0x3fc

sendButtonEvent是模拟器中的一个函数,他是:

  • 获得最前面的AppPort
  • 通过sendPurpleEvent或HIDEvent发送消息

在越狱应用程序,你可以做一些像(没有testing,但应该工作):

 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);