在 iphone 上模拟触摸

Posted

技术标签:

【中文标题】在 iphone 上模拟触摸【英文标题】:Simulate touch on iphone 【发布时间】:2010-11-09 18:35:42 【问题描述】:

我试图模拟 UIWebView 上的触摸,如何以编程方式在某个位置触发触摸事件? (x 和 y 坐标) 只需调用 touchesBegan?

理想情况下,我希望在没有任何 javascript hack 的情况下这样做,因为将来它可能不是 uiwebview

【问题讨论】:

您想要在运输应用程序中使用代码还是希望执行 UI 测试? 如果可能的话,是否适合运输应用程序? 你在 UIWebView 上得到这个工作了吗?我可以让它在其他类型的视图上工作,但它不会在 UIWebView 中生成 DOM 事件。 PLZ如果有人可以帮助我***.com/questions/26460614/simulate-touch-on-ios7-8 @Nate 你有没有找到任何替代品,现在在 iOS9 时代,所有那些旧的好 GSEvent API 不再可用(我猜是从 iOS7 开始)? 【参考方案1】:

在 iPhone 上合成一个触摸事件并不容易:您必须使用未公开的 API,因此您很有可能在 iOS 的每次更新中中断并被 Apple 拒绝。

Here's 演示如何在 iPhone 上合成触摸事件的链接:

这是关于 *** 的另一个问题:How to send a touch event to iPhone OS?

【讨论】:

【参考方案2】:

这里值得指出的是 KIF 框架。它旨在在模拟器中运行,但部分代码正在模拟代码中的触摸事件。运气好的话,这将是一个很好的起点。

https://github.com/square/KIF

具体看stepToTapViewWithAccessibilityLabel中的KIFTestStep.m和一行

[view tapAtPoint:tappablePointInElement];

【讨论】:

【参考方案3】:

您需要做的是首先创建您想要的事件,然后通过“紫色端口”将它们发送到 SpringBoard,例如。马赫端口。要使它们在系统范围内,您必须通过端口将它们转发到每个应用程序。这意味着您需要实际执行窗口管理器所做的事情并查看哪个应用程序处于活动状态、屏幕锁定等。

有很多私有框架 API(IOSurface、GraphicServices、SpringBoardServices 等)可以为您提供所需的部分。

您必须在运行时使用 dlopen() 之类的工具加载这些私有框架。

从 iOS 6.1.4(当前 ATM)开始,这是 100% 可能没有越狱的,但是您将加载苹果不允许用于 AppStore 的私有框架;)

【讨论】:

你能告诉我它在 iOS 7 上是如何工作的吗?对于 iOS 7 GSEvent API 已被弃用【参考方案4】:

这是可能的。正是您提到的方式,使用 GSEvents 并将它们发送到您尝试控制/模拟的应用程序的紫色命名端口。当然,您需要 KennyTM 的 GSEvent.h 来完成此操作。 我已经为 iOS 4.3 做到了这一点,只是通过更改 Kenny 拥有的一些值(如 kGSHandInfoTypeTouchDown),但现在我正在尝试为 iOS 5 做这件事,但到目前为止它还没有工作。

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

【讨论】:

我建议您将您的 App 接收到的每个 UIEvent 转换为 GSEvent 进行分析。您甚至可以尝试接收 GSEvent 进行触摸,然后重新发送。然后开始构建自己的结构并相应地更改字段。 KennyTM 的 API 是一个好的开始,它实际上适用于 iOS 4.3(您只需要填写字段值,但就像我说的一些是恒定的并且没有任何解释,例如 PathProximity,它是 2 用于 TouchDown 事件,1 用于TouchUp.PathIndex 始终为 2,pathMajorRadious 和 pathPressure 始终为 1.0 等) @JorgeAguirre 你能告诉我它在 iOS 7 上是如何工作的吗?对于 iOS 7,GSEvent API 已被弃用。【参考方案5】:

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

【讨论】:

你确定吗?我最近一直在研究 GSEvent 私有 API (github.com/rpetrich/iphoneheaders/blob/master/GraphicsServices/…) 并且能够在我的应用程序处于后台时“按下”打开和关闭锁定按钮,我无法使用 GSEvent 模拟触摸不管我的应用程序是否在后台运行(但是我可以执行 Accelerometer 事件)。

以上是关于在 iphone 上模拟触摸的主要内容,如果未能解决你的问题,请参考以下文章

在 iPhone 6S 或 iPhone 6S Plus 模拟器上模拟力度触控/3D 触控

iPhone设备上的sencha触摸应用程序非常慢

如何向 iPhone OS 发送触摸事件? [复制]

Safari浏览器(iPhone模拟器):如何查看/监控所有被触发的事件?

移动触摸设备(iPhone、Android、Windows)上的悬停效果

在 iPhone 上处理多次触摸