在iPhone上模拟触摸

11

我想模拟在UIWebView上触摸屏幕,如何在特定位置(x和y坐标)编程执行触摸事件?只需调用touchesBegan函数吗?

理想情况下,我希望不使用任何JavaScript技巧实现,因为将来可能不再使用UIWebView。


你是想获取用于运输应用的代码,还是想进行UI测试? - Justin
如果可能的话,为一个运输应用程序? - Jonathan.
1
你在UIWebView上实现了吗?我可以在其他类型的视图上实现,但是在UIWebView中它不会生成DOM事件。 - richcollins
请问有没有人可以帮我解决这个问题:http://stackoverflow.com/questions/26460614/simulate-touch-on-ios7-8 - Dhekra Zaied
@Nate,你有没有在iOS9时代找到任何替代品来取代那些旧的好GSEvent API(自iOS7以来就不再可用了)? - JBA
@JBA,迄今为止我还没有。我没有非常努力地寻找过。但是,我同意。再次拥有它们将非常有用。 :( - Nate
5个回答

12

在iPhone上合成触摸事件并不容易:您必须使用未公开的API,因此每次iOS更新都有很高的可能性出现故障,并且可能会被苹果拒绝。

这里是一个演示如何在iPhone上合成触摸事件的链接:

以下是StackOverflow上的另一个问题:如何向iPhone OS发送触摸事件?


4
值得一提的是KIF框架。它旨在在模拟器中运行,但代码的一部分是通过代码模拟触摸事件。希望这将是一个很好的起点。

https://github.com/square/KIF

具体来说,请查看KIFTestStep.m中的stepToTapViewWithAccessibilityLabel和该行。
[view tapAtPoint:tappablePointInElement];

4
你需要做的是先创建你想要的事件,然后通过“紫色端口”(例如mach端口)将它们发送到SpringBoard。要使它们在系统范围内生效,你必须通过端口将它们转发到每个应用程序。这意味着你需要实际上做窗口管理器正在做的事情,并查看哪个应用程序处于活动状态、屏幕锁定等。
有几个私有框架API可用(IOSurface、GraphicServices、SpringBoardServices等),可为你提供所需的组件。
你将不得不在运行时使用类似dlopen()的东西加载这些私有框架。
截至iOS 6.1.4(目前为止),这在没有越狱的情况下是100%可能的,但你将会加载私有框架,这是苹果不允许在AppStore中的。

你能告诉我它在iOS 7上如何工作吗?对于iOS 7,GSEvent API已被弃用。 - Nishith Shah

1

这是可能的。就像你提到的那样,使用GSEvents并将它们发送到您要控制/模拟的应用程序的紫色命名端口。当然,您需要KennyTM的GSEvent.h才能实现此目的。 我已经在iOS 4.3上完成了这个过程,只需更改Kenny的一些值(如kGSHandInfoTypeTouchDown),但现在我正在尝试在iOS 5上执行它,但到目前为止还没有成功。

编辑:现在它适用于iOS 5.1。


我建议您将应用程序接收到的每个UIEvent转换为GSEvent进行分析。您甚至可以尝试接收触摸的GSEvent,然后重新发送它。然后开始构建自己的结构并相应地更改字段。KennyTM的API是一个很好的起点,它实际上可以与iOS 4.3一起使用(您只需要填写字段值,但像我说的一样,有些是常量,并且没有任何解释,例如PathProximity,对于TouchDown事件为2,对于TouchUp为1。PathIndex始终为2,pathMajorRadious和pathPressure始终为1.0等)。 - Jorge Aguirre
@JorgeAguirre,您能告诉我它在iOS 7上如何工作吗?因为在iOS 7中,GSEvent API已被弃用。 - Nishith Shah

-1

如果没有越狱,就没有真正的方法将手势识别器钩入整个系统的所有视图中。首先,后台运行的您的应用程序没有执行此代码的能力。


你确定吗?最近我一直在研究GSEvent私有API(https://github.com/rpetrich/iphoneheaders/blob/master/GraphicsServices/GSEvent.h),并且能够在我的应用程序在后台运行时“按下”锁定按钮,但无论我的应用程序是否在后台运行,我都无法使用GSEvent模拟触摸(但我可以进行加速度计事件)。 - user293895

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接