Xcode 9的主线程检查器和XCUITests

苹果公司最近发布了Xcode 9的稳定版本,其中包含许多新功能。 大多数iOS开发人员都说Xcode 9是最好的版本,因为它具有iOS开发人员一直想要的强大新功能。 您可以在此处阅读有关Xcode 9功能的更多信息。
我们刚刚将现有的XCUITest套件迁移到Xcode 9,发现通过XCTest编写的单元测试通过了,但是XCUITests停止工作并出现以下错误。

 主线程检查器:在后台线程上调用的UI API:-[UIApplication委托]
 PID:740,TID:51958,线程名称:(none),队列名称:FIRAnalyticsQueue,QoS:9 

XCUITests根本无法启动代理测试运行器应用程序,并且测试套件崩溃了。 从错误消息中可以明显看出,这与Firebase SDK有关,并且与主线程检查程序有关。 你们中的某些人可能已经陷入这个陷阱,或者您将很快迁移到Xcode9。在本文中,我们将讨论该错误的全部原因,以及新的具有Xcode功能的主线程检查器将如何帮助捕获潜在的错误。在应用程序中。

在陷入错误之前,我们将学习WTF是Main Thread Checker,以及Apple为何将其作为Xcode 9的一部分引入的原因。根据文档,“ Main Thread Checker从后台检测到对AppKit,UIKit和其他API的无效使用”线。 “ 这是什么意思?。 iOS开发人员可以轻松理解这一点,但是对于其他人,我将尝试用简单的语言进行解释。

有一些Apple框架旨在仅在主线程中在iOS应用中使用,在后台线程中使用这些框架是一种罪过。 如果您在后台线程中使用这些框架,那么您可能会在下一生中下地狱。 如果iOS工程师在后台线程中使用这些框架,则会发生疯狂的事情,如UI响应迟钝,视觉缺陷,数据损坏和崩溃。 简而言之,在后台线程中使用这些框架将使您的iOS应用成为可能。 主线程检查器发现框架的这种无效用法,并在运行时警告工程师,不要这样做。 它可以检测出罪魁祸首,以便您在不解决问题时对其进行惩罚。 Main Thread Checker是方便的工具,可以尽快检测到代码中的错误。 默认情况下,它在Xcode 9中被激活。

XCUITest启动名为XCUIApplication的代理测试运行器应用程序,以在代理应用程序中启动测试。 相应方案的XCUITest的主线程检查器处于活动状态。 在启动应用程序的UI时,主线程检查器检测到Firebase SDK在后台线程中使用了UP API。 Firebase团队已修复了Github上存在的问题。

可能还有其他一些第三方框架可能存在相同的问题,例如Flurry用户也在此处在Github上报告了相同的问题,但在撰写本文时仍未解决。

我们几乎没有办法解决此问题并开始使用带有Xcode 9的XCUITests。

  • 如果问题在应用程序内部,我们可以通过解决iOS框架无效使用的问题来修复XCUITests。
  • 如果主线程检查器检测到Firebase SDK等第三方框架中的问题。 我们需要让他们立即解决问题。
  • 如果主线程检查器检测到第三方框架中存在的问题,并且他们无法及时解决该问题,那么不幸的是,我们需要从该方案中禁用主线程检查器。 转到“产品”>“方案”>“管理方案”,搜索用于测试的方案,然后在左侧栏中按“编辑”,然后按“测试”,然后转到“诊断”并取消选中“主线程检查器”复选框

请记住,这不是理想的解决方案,这是我们不应该在代码中添加的hack。 我们应该专注于直接在代码中解决导致无效使用框架的问题。

我希望,当您遇到相同的问题并节省几个小时的调查时,您会发现这篇文章很有用。 您是否已将XCUITests迁移到Xcode 9? 你有什么经验? 在评论中让我知道。

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..