- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在viewDidLoad
iOS 8 扩展程序中。在 NSLog
输出没有在Xcode。NSLog
虽然可以在容器应用程序中正常工作。
如何从扩展的调试消息中获取输出?
- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在viewDidLoad
iOS 8 扩展程序中。在 NSLog
输出没有在Xcode。NSLog
虽然可以在容器应用程序中正常工作。
如何从扩展的调试消息中获取输出?
Answers:
调试应用扩展程序的步骤:
运行容器应用程序。在此步骤中,Xcode将容器应用程序和应用程序扩展名上载到设备或模拟器。
停止容器应用程序。在模拟器中调试时,此步骤很重要。如果您不这样做,Xcode会告诉您模拟器正在使用中。
在Xcode中,按菜单调试->附加到进程->按进程标识符(PID)或名称...,输入应用程序扩展名的标识符,例如com.abc.ContainerApp.MyExtension,以开始调试。不要忘记设置断点。(2014年8月25日更新:您可以直接输入MyExtension(您的扩展名)。)
在设备或模拟器中,打开您的应用扩展程序。
我发现上面的调试步骤在Xcode 6 beta 6和模拟器上的iOS 8 SDK beta 5上无法正常运行。
解:
断点起作用。但是我不知道为什么日志没有显示在输出窗口中。
我也有这个问题。如果您进入“调试”->“打开系统日志...”菜单下的“模拟器”,它将对我有用。
在这里,您可以查看iPhone模拟器的所有日志(包括扩展程序的日志)。
NSLog
运行完美。
您只是看不到Xcode调试区域中正在记录的内容,因为Xcode调试器未附加到您的扩展中。扩展几乎完全独立于其包含的应用程序。例如,它们具有单独的捆绑包标识符,并且它们也是OS上的单独进程。
在使Xcode附加到扩展方面,我取得了各种成功。似乎它会自动附加,并且在调试导航器中显示为“等待附加”,但是从不附加。
有时,我可以在Xcode中运行扩展目标:
然后可以选择要在其中运行我的扩展程序的应用程序。在这种情况下,我将选择其建议“ today”,即通知中心。
然后它有时会将调试器附加到我的扩展程序中。注意,看来这种方法仅适用于物理设备。
如果没有附加,您可以在@VinceYaun的答案中使用手动附加方法,
使用其他依恋方法也取得了不同的成功。大多数都没有成功,看来它们只是以后会修复的错误。
要查看您的日志消息,请转到 Window
Devices
顶部栏中的-> 并选择您的设备。您可以从该窗口的底部显示设备日志。如果您正在模拟器上进行测试,则可以使用@BalestraPatrick的答案。
Beta 2中已修复了一些错误,我的猜测是最终调试器在启动扩展程序时会自动进行附加。
更新:在iOS 8 Beta 4 发行说明中:
扩展名
已在Beta 4中修复
- 从Xcode调试时,扩展有时无法启动。
- 当带有UI的扩展被杀死时,它将重新启动并且不会被关闭。
- 有时,您的共享或操作扩展名可能会挂起。
- 重新部署扩展程序可能会在通知中心将其禁用。
它对我有用:)
NSLog
仅在运行容器应用程序时有效。如果您正在运行应用程序扩展名而不是容器,则它将无法正常工作。
Xcode 8能够调试扩展:
结果:断点和日志照常工作。
实际上,我的日志可以在Xcode 6.3中非常简单地运行。首先,构建并运行包含的应用程序。包含应用程序在设备上运行后,通过将方案更改为应用程序扩展名来构建并运行应用程序扩展名。
一个对我有用的技巧(尽管这很丑陋)是将一个虚拟对象放置UILabel
在扩展程序的底角处。我通常称之为logLabel
。然后可以使用任何要记录的日志语句来更新此标签的文本。如果需要从不同类的实例记录语句,则这种方法不是很好。而且,显然,它会使您的UI混乱。
但是,如果您有一个非常简单的小部件,并且您不介意UI过于混乱,那么就可以解决问题。我尝试了本次讨论中概述的所有其他解决方案,但不幸的是,这些解决方案都不适合我。
您应该知道,容器应用程序和扩展程序在iOS中完全是两个不同的过程,而LLVM一次仅调试一个线程,因此在调试时,控制台永远不会记录扩展程序,也永远不会在断点处停止。
您可以使用@Vince Yuan的方法解决大多数问题。
但是,我的问题是Xcode调试器几乎不挂在iOS Simulator和设备上的键盘扩展上,就像7-8次运行1次一样,这完全是概率问题。@Vince Yuan的方法有时也适用。
我的小经验是,当您运行调试方案时,如果左侧面板中的debug Session显示“ No Debug Session”,则无需打开扩展并对其进行测试,调试器不会挂接,只需运行再次幸运。
但是当您看到com.xxx.xxx.xxx正在等待附加时,扩展名肯定可以得到调试。
对于无法调试iOS扩展(尤其是键盘扩展)的用户来说,这是一个小技巧。