在iOS7上注入系统范围的触摸事件

时间:2013-10-19 21:53:13

标签: iphone ios objective-c ios7 iphone-privateapi

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

在iOS7上,这些调用似乎无声地失败了。在Simulating system-wide touches in iOS 7中已经提出了另一种选择,但它仅适用于越狱设备。 https://github.com/kif-framework/KIF看起来像另一个选项,但它似乎只支持为当前应用程序而不是系统范围注入事件(例如,当你的应用程序在后台时,你无法注入触摸事件)

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

3 个答案:

答案 0 :(得分:2)

我认为你需要在系统范围内为测试场景做这个吗?在这种情况下,Apple的 UI Automation 框架可以为您提供良好的服务,这是一种基于JavaScript的工具,可用于设备上测试。

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

UIATarget.localTarget().deactivateAppForDuration(seconds);

以下是文档:

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

答案 1 :(得分:-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]; 
        }
    }
    .....

答案 2 :(得分:-5)

我认为你最好使用iOS SDK Notification服务api。这将是达到你想要的最干净的方式。

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

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

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