Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在iOS7上注入系统范围的触摸事件_Iphone_Ios_Objective C_Ios7_Iphone Privateapi - Fatal编程技术网

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

Iphone 在iOS7上注入系统范围的触摸事件,iphone,ios,objective-c,ios7,iphone-privateapi,Iphone,Ios,Objective C,Ios7,Iphone Privateapi,在iOS7之前,可以使用GSSendSystemEvent和GSSendEvent私有API调用注入触摸事件,例如: 但在iOS7上,这些调用似乎悄悄地失败了。中提出了一种替代方案,但它仅适用于越狱设备。看起来像是另一个选项,但它似乎只支持为当前应用注入事件,而不支持系统范围内的事件(例如,当应用在后台时,无法注入触摸事件) 那么,如何在不越狱的情况下在iOS7上注入系统范围内的触控事件呢?您可以将UIWindow子类化并覆盖sendEvent。我用它来实现一个多侦听器模式,但你也可

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

但在iOS7上,这些调用似乎悄悄地失败了。中提出了一种替代方案,但它仅适用于越狱设备。看起来像是另一个选项,但它似乎只支持为当前应用注入事件,而不支持系统范围内的事件(例如,当应用在后台时,无法注入触摸事件)


那么,如何在不越狱的情况下在iOS7上注入系统范围内的触控事件呢?

您可以将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]; 
        }
    }
    .....

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

从概念上讲,苹果(目前)并不打算让第三方发布系统范围的活动,因为这与iOS精心策划的模式不符,这就是人们求助于私人API和越狱的原因。顾名思义,私有API不应该被依赖

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


在Mac上,XPCServicesAPI允许进程之间进行通信,但仍然不是生成系统范围事件的一种方法。我建议您使用iOSSDK的通知API,这可能是实现您想要的最干净的方法。是的,它向苹果公司发送,然后返回到设备,但这是目前可用的机制。

我想你需要在整个系统范围内进行测试场景?在这种情况下,苹果的用户界面自动化框架可能会为您提供很好的服务,这是一个基于JavaScript的工具,可用于设备测试

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

UIATarget.localTarget().deactivateAppForDuration(秒)

以下是文件:


@user2485972建议在此处提供GSSendEvent的替代方案我没有看到任何证据表明@user2485972有一个在后台工作的解决方案。听起来他可能在前台用他的应用程序模拟触摸。(因为他提到除了需要处理手势识别器外,还需要使用KIF。)如果有人想出了解决方案,你会喜欢它的……你用这些触摸事件来实现什么?有没有其他方法可以解决这个问题?我认为苹果可能认为注入系统范围的触控事件是有恶意意图的,因此在ios7中关闭了它?有人知道这个问题的答案吗?我需要在iOS8中注入系统范围的触摸。我已经在这里问过类似的问题:但没有人回答。我真的需要尽快回复。你不能发送这样的系统范围的事件,例如,当你自己的应用程序在后台时单击应用程序。UI自动化是最糟糕的测试框架之一。无法读取的输出(未记录,并且经常中断)。测试经常中断,因为没有办法测试动画,而且你必须在任何地方都包含随机睡眠时间。手势有时会冻结应用程序。有更好的测试框架。谢谢你的反馈。我很想知道您在其他框架方面的经验,以及您可以推荐哪些框架?(我对UI自动化的接触有限,我觉得随着Xcode 5和Mac OSX 10.9 Mavericks服务器中新的集成测试,UI自动化已经得到了改进。)我不能谈论Mac OS,但在iOS中使用UI自动化真是太糟糕了。有许多开源和付费框架。它们中的大多数都使用较低级别的UI自动化来生成事件,但功能更强大。听起来不错。我最感兴趣的是iOS方面。您使用过哪些比UI自动化更好?@richarddas:op询问如何注入系统范围的事件,但您的建议不起作用,因为在Instruments中使用UI自动化javascript框架(来自您的代码行)只能在当前测试的应用程序中起作用。当您停用应用程序时,脚本将暂停,直到应用程序返回,因此不允许您发送系统范围的事件。