在iOS7上注入系统触摸事件

在iOS7之前,可以使用GSSendSystemEventGSSendEvent私有API调用注入触摸事件,例如:

  • GSSendEvent – 注入触摸事件iOS
  • 在iOS上模拟系统宽接触事件
  • iOS上的全系统模拟
  • 在iOS 6上发送全局触摸事件

在iOS7上,这些调用似乎默默无闻。 在iOS 7中模拟系统级触摸时提出了一个替代scheme,但它只适用于越狱设备。 https://github.com/kif-framework/KIF看起来像另一种select,但它似乎只支持注入当前应用程序的事件,而不是系统范围(所以你不能注入触摸事件,而你的应用程序例如在后台)。

那么如何在iOS7上注入系统触摸事件,而不会越狱?

我假设你需要在系统范围内完成testing场景? 在这种情况下,您可能会得到苹果的UI自动化框架服务,这是一个基于JavaScript的工具,可用于设备上的testing。

虽然您不能像模拟主页button那样执行任何操作,但您可以将应用程序发送到后台一段指定的时间,例如:

UIATarget.localTarget().deactivateAppForDuration(seconds);

这里是文档:

https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef

您可以inheritanceUIWindow并覆盖sendEvent。 我用它来实现一个多听众模式,但你也可以用它来触发事件…

 - (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]; } } ..... 

我想你最好使用iOS SDK通知服务api。 这将是实现你想要的最干净的方式。

从概念上讲,苹果公司目前还没有打算第三方发布系统级的事件,因为iOS不能很好地pipe理模型,这就是人们诉诸私有API和越狱的原因。 顾名思义,私有API不应被依赖。

除非您对整个系统负责,否则用户应用程序不可能是这样,您真的没有业务生成系统范围的事件。 我知道Android如何做到这一点,但这是另一个故事(不适合这个话题)。

在Mac上,XPC Services api允许进程彼此通信,但仍然不是生成系统事件的一种方法。 我build议你使用iOS SDK的通知API,这可能是最干净的方法来实现你想要的。 是的,它会发送到苹果,并回到设备,但这是迄今为止可用的机制。