使用 KIF 以编程方式将点击事件发送到 iOS 中的后台坐标

Programmatically sending tap event to coordinates in background in iOS using KIF

想法是制作一个可以在 iOS 中的另一个应用程序的后台连续发送 'tap the screen at coordinates (x,y)' 事件的应用程序。想想 'Cookie Clicker' 作弊。我目前正在帮助我的朋友开发他的应用程序,我的工作是尝试尽可能多地解决问题。我有一种轻微的感觉,尽可能多地点击他的一个按钮会破坏他的应用程序,这就是我来这里的原因。

该方法使用 KIF 以及 iOS 中的后台执行来实现此目的。

  1. 在其中一个 class 中,文件 KIFUITestActor.m 具有代码:

    - (void)tapScreenAtPoint:(CGPoint)screenPoint
    {
    
    [self runBlock:^KIFTestStepResult(NSError **error) {
    
    // Try all the windows until we get one back that actually has something in it at the given point
    UIView *view = nil;
    for (UIWindow *window in [[[UIApplication sharedApplication] windowsWithKeyWindow] reverseObjectEnumerator]) {
        CGPoint windowPoint = [window convertPoint:screenPoint fromView:nil];
        view = [window hitTest:windowPoint withEvent:nil];
    
        // If we hit the window itself, then skip it.
        if (view != window && view != nil) {
            break;
        }
    }
    
    KIFTestWaitCondition(view, error, @"No view was found at the point %@", NSStringFromCGPoint(screenPoint));
    
    // This is mostly redundant of the test in _accessibilityElementWithLabel:
    CGPoint viewPoint = [view convertPoint:screenPoint fromView:nil];
    [view tapAtPoint:viewPoint];
    
    return KIFTestStepResultSuccess;
        }];
    }
    

    这是否是我正在寻找的代码,我将如何在 Swift 中实现它? (或者 Objective-C 如果它能让事情变得更简单?)

  2. 是否运行class作为后台服务实现后台执行?

非常感谢您能回答这个问题。

几个选项,具体取决于您有权访问的内容。如果您有想要 'bug out' 的其他应用程序的实际 IPA,并且可以将测试目标附加到它,那么 KIF 是一个不错的选择。

这是关于 UI 使用 KIF 进行测试的小指南(很容易搜索,link here)。一个简短的总结是:

  [tester tapViewWithAccessibilityLabel:@"Clear"];

那种代码应该有一个等效的名称 tapViewAtPoint 或类似的东西(我上次使用 KIF 是在一年多以前,但它应该像当时一样被很好地记录下来)。

但是,如果您无法访问您要攻击的应用程序(对于此类问题,这似乎更有可能),那么您可以完全使用不同的方法。

如果您至少可以在 iPhone 模拟器中下载应用程序,

Automator 可以帮助您编写脚本。由于 Xcode 9 我相信允许你这样做,这部分应该不难,只要目标应用程序在应用程序商店上。

如果不是,并且您没有代码,我很想知道您是如何分发该应用程序的,因为可能仍然有办法使用我建议的一个或另一个选项。祝你好运!

编辑:基于重新阅读问题的更新+赏金请求再次

Would running the class as a background service achieve the background execution?

这又取决于您是否可以 运行 将其作为后台服务。如果您有权访问代码本身,那么就可以完成,尽管我不确定您描述的问题中后台执行的目标是什么。

KIF 将无法处理不在前台的任何内容。一般来说,iOS 设备永远不会在后台将点击漏斗到应用程序,因此如果被测试的攻击向量是重复点击应用程序,则后台执行可能不是答案。

从你的问题来看,这看起来更像是一个并行化 tap 循环的用例,你的问题似乎可以从 Xcode 9 的并行模拟器功能添加中受益。

虽然我还没有亲自尝试过,但您可以在一台机器 运行ning Xcode 9 上的多个模拟器中并行 KIF 运行s。这可能是获取尽可能多的关于导致问题的数据点的最佳方式,因为 UI tests 您可以随时截取应用程序的屏幕截图。在 Xcode 9 中,我相信还有一个新功能可以直接从 Simulator 录制视频(不再需要 Quicktime)。