如何调试iOS应用程序扩展?

10

我正在调试一个iOS应用程序扩展,我只能设置断点,但能够在控制台打印信息会更好。

Xcode 9是否支持这个功能?

或者至少能否将信息读取到某个地方,比如文件中?

我查看了我的设备日志在“设备和模拟器”中,但无法找到我从iOS应用程序扩展中打印的内容。


2
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/debugging_tools.html - koen
@Koen 显然这不同于调试应用程序,所以对我来说这行不通。 - pguzman
1
这个问题已经有答案了:如何调试iOS扩展(.appex)? - Top-Master
@Top-Master,您介意添加自己的答案吗?老实说,我没有理解您在我的答案中包含的代码,不得不回滚。这是一个巨大的变化。如果您能逐行解释代码正在做什么,那将是很好的,因为它不是标准的Swift,而是C。 - mfaani
@Honey 请查看如何检测Swift应用程序是否正在从Xcode运行(我在那里添加了注释,并在此帖子中标记为重复)。 - Top-Master
4个回答

6

了解:

  • 在任何时候,您只能调试一个目标
  • 目标必须附加到Xcode的调试器上
  • 应用扩展是与其包含应用程序(目标)分开的一个独立目标

解决方案:

进入Xcode >> Debug >> Attach to process >> 然后选择您的appExtension目标即可

注意:

如果您要调试的扩展是由操作系统触发的,则需要执行某些操作以使操作系统触发它。然后您才能将它附加到调试器上。例如:如果您要调试“通知服务扩展”,则只有在连接了iPhone并发送推送通知打开服务扩展之后,您才会在目标列表中看到它。

此外,我还遇到了一些奇怪的问题,即运行应用程序只会在启动时崩溃。解决方法是将appex从调试器中取消附加,然后启动普通应用程序,再次附加appex。


相信如果您还使用了os.log,那么它也会记录到控制台,但我不确定这一点。


这个答案,特别是关于扩展程序在列表中不会显示直到被触发的说明,正是我正在寻找的。但是,我仍然无法使扩展代码中设置的断点被触发。 - NRitH

4
我找到了一个方法,虽然不是完美的,但至少现在我能看到我打印出来的内容了。
我使用了 os_log("this is what i will see")函数(你需要导入os)。
1- 我设置了一个环境变量 OS_ACTIVITY_MODE = default(不是 disable)在我的扩展方案中。
2- 我在我的设备上构建我的应用程序。
3- 我将我的扩展附加到一个进程(我的应用程序)中。
4- 您可以在控制台应用程序(打开 /Applications/Utilities/Console.app)或打开窗口 -> 设备和模拟器来查看您的设备控制台中的日志。
控制台应用程序选项是最好的。

1
您可以像调试其他应用程序一样,选择目标和设备,然后运行扩展程序来调试应用程序扩展。您需要在打开的对话框中选择要与扩展一起运行的应用程序。
在从应用程序启动扩展之后,控制台将被清除,并且您可以看到使用NSLogprint打印的任何内容。 NSLog消息也应出现在设备日志中,但很难检测到。
我建议使用QorumLogs,它提供了结构化和彩色的日志输出,这样您就不会错过任何消息。

1
我按照你说的做了,但是没有任何反应。我还尝试将扩展附加到进程(我的主要应用程序)上,但是控制台或设备日志中也没有任何信息。 - pguzman
我认为QorumLogs使用os_log,因此它应该在控制台中显示,稍后我会尝试一下,谢谢。 - pguzman

0

你可以使用“占位符”变量来打印一些调试信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接