以编程方式触发摇动事件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);