49

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

在 iOS7 上,这些调用似乎默默地失败了。在 iOS 7 中模拟系统范围的触摸中提出了一种替代方案,但它仅适用于越狱设备。https://github.com/kif-framework/KIF看起来像是另一种选择,但它似乎只支持为当前应用程序注入事件而不是系统范围内的事件(因此您在应用程序时无法注入触摸事件例如,在后台)。

那么如何在没有越狱的情况下在 iOS7 上注入系统范围的触摸事件呢?

4

3 回答 3

2

我假设您需要在整个系统范围内为测试场景执行此操作?在这种情况下,Apple 的UI 自动化框架可能会为您提供很好的服务,这是一种基于 JavaScript 的工具,可用于设备上的测试。

虽然您无法执行模拟主页按钮按下等操作,但您可以将应用程序发送到后台指定的持续时间,例如:

UIATarget.localTarget().deactivateAppForDuration(seconds);

以下是文档:

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

于 2014-01-31T11:41:45.363 回答
-4

您可以继承 UIWindow 并覆盖 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]; 
        }
    }
    .....
于 2013-11-14T18:03:24.850 回答
-5

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

从概念上讲,Apple (还)不打算让第三方发布系统范围的事件,因为这不适合 iOS 精心策划的模型,这就是人们求助于私有 API 和越狱的原因。顾名思义,私有 API 不应该被依赖。

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

在 Mac 上,XPC Services api 允许进程相互通信,但仍然不是一种生成系统范围事件的方法。我建议您使用 iOS SDK 的通知 API,这可能是实现您想要的最简洁的方法。是的,它传给 Apple,然后传回设备,但这是迄今为止可用的机制。

于 2014-01-08T13:01:14.567 回答