如何调试iOS Appex

在“调试,分析和测试您的应用程序扩展”说明了如何使用主机应用程序调试iOS应用程序扩展(“ appex”)时,有时不依赖特定应用程序会更加方便。 一个很好的例子是在Network Extension框架之上构建的appex,例如自定义隧道提供程序-当用户从“设置”应用⚙️打开VPN时,iOS启动这种类型的扩展。

术语

  • 包含应用程序 -在捆绑包中附带应用程序扩展并允许对其进行调整的应用程序[appex]。
  • 主机应用程序 -设备上安装的任何其他应用程序,都可以使用第三方应用程序。
  • Appex-应用程序扩展名(或简称为“扩展名”)与包含应用程序一起提供,但由主机应用程序启动。

生成并运行

首先,appex是二进制文件,因此必须对代码进行任何更改,并将生成的二进制文件复制到设备中。 因此,每次您对包含的应用和/或其appex进行更改时,请点击“构建并运行”以获取包含的应用方案 。 等到该应用程序安装并启动。 此时,您可以确定已安装更新的appex二进制文件。

知道您的流程名称

您将使用适合于appex类型的任何方法启动appex。 例如,可以从包含的应用程序或“设置”应用程序中的“ VPN设置”面板直接启动“自定义隧道提供程序”扩展。 另一方面,必须先将“自定义键盘”扩展名安装到系统中并授予一些权限,然后用户才能从几乎所有具有键入功能的应用程序中启动键盘。

在启动扩展之前,进入Xcode菜单Debug- > Attach to Process 。 等待列表加载完毕,然后在“ 可能的目标”下找到进程名称。 您很快将需要它。

停止

现在,停止包含应用程序,appex和主机应用程序(如果有)。

添加断点

将断点添加到应用程序扩展的主体类中很重要。 因为应用程序扩展类型之间的入口点(启动appex进程时首先被调用的方法)有所不同,所以请查阅文档以找出调试期间在哪里中断。

附加到流程

在Xcode中,转到“ 调试” ->“ 按PID或名称附加到进程…” ,并确保进程名称与您先前捕获的名称相对应。 点击附加 。 然后,等待Xcode等待连接-按Command + 7找出状态。

启动appex

执行您希望启动扩展程序的所有操作。 换句话说,以某种方式使用它。 只要Xcode检测到iOS已启动,Xcode就会方便地附加到您的appex流程中。 它还会在命中的第一个断点处中断执行。

NOTE️ 注意:在撰写本文时,最新的Xcode 9.4.1的lldb通常无法发现该进程并将其附加。 因此,需要从头开始。

日志

如果没有在开发过程中仔细记录整个代码,调试就永远不会令人惊奇。 不幸的是,使用上述方法, lldb不会将输出转发到Xcode。 您在这里有两个选择:

  1. 使用Windows-> 设备和模拟器菜单,然后从该窗口查看登录信息。

2.使用Apple Configurator 2并在控制台侧菜单下找到日志。

3. [首选]使用Console.app查找日志。

不幸的是,前两种方法让您处理“日志腹泻”:您应该对大量日志进行分类,以找到由appex记录的日志。 虽然某种已建立的日志记录格式格式很有帮助 ,但Console.app允许过滤设备的输出,因此简化了分析。

Console.app注意:一些应用程序扩展与系统恶魔一起运行。 这些过程可能还会记录一些有用的信息。 但是,知道这些进程的名称可能很棘手。