- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在iOS 8扩展的viewDidLoad
中,NSLog
在Xcode中没有输出。然而,在容器应用程序中,NSLog
像往常一样工作。
我该如何从扩展中获取调试消息的输出?- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在iOS 8扩展的viewDidLoad
中,NSLog
在Xcode中没有输出。然而,在容器应用程序中,NSLog
像往常一样工作。
我该如何从扩展中获取调试消息的输出?调试应用程序扩展的步骤:
运行容器应用程序。 在此步骤中,Xcode将容器应用程序和应用程序扩展上传到设备或模拟器。
停止容器应用程序。 当您在模拟器中进行调试时,此步骤非常重要。 如果您不这样做,Xcode会告诉您模拟器正在使用中。
在Xcode中,按菜单 Debug -> Attach to Process -> By Process Identifer (PID) or Name...,输入应用程序扩展的标识符(例如com.abc.ContainerApp.MyExtension)开始调试。不要忘记设置断点。(2014年8月25日更新:您可以直接输入您的扩展名MyExtension。)
在设备或模拟器中打开您的应用程序扩展。
我发现上面的调试步骤在Xcode 6 beta 6和iOS 8 SDK beta 5上的模拟器上效果不佳。
解决方法:
断点有效。但我不知道为什么日志没有显示在输出窗口中。
如果您在模拟器下进入“调试”菜单 -> “打开系统日志...”,它对我有效。
从这里,您可以查看iPhone模拟器的所有日志(包括您的扩展日志)。
NSLog
正常工作。
你没有在 Xcode 的调试区域看到日志是因为 Xcode 调试器没有附加到你的扩展上。扩展与其所包含的应用程序几乎完全独立。例如,它们有不同的包标识符,并且它们也是操作系统上的单独进程。
我成功地让 Xcode 附加到扩展上的经验是各种各样的。据说它似乎会自动附加,并在调试导航器中显示为 "等待附加",但从未附加过。
有时,我能够在 Xcode 中运行我的扩展目标:
然后选择要在哪个应用程序中运行我的扩展。在这种情况下,我会选择它推荐的 "Today",即通知中心。
然后它有时会将调试器附加到我的扩展上。请注意,此方法仅适用于物理设备。
如果它没有附加,则可以使用 @VinceYaun 的答案中的手动附加方法。
我还尝试了其他的附加方法,但成功率不高,而且它们似乎只是将来会修复的错误。
要查看日志消息,您需要在顶部菜单栏中选择 Window
-> Devices
并选择您的设备。您可以从该窗口底部打开设备日志。如果您正在模拟器上测试,则可以使用 @BalestraPatrick 的答案。
一些错误已经在 Beta 2 中得到修复,我的猜测是,当启动扩展时,调试器最终会自动附加。
更新:在iOS 8 Beta 4的发布说明中:
扩展功能
Beta 4中已修复问题
- 有时从Xcode调试启动扩展会失败。
- 当UI扩展被终止时,它会重新启动并且不会消失。
- 有时您的共享或操作扩展可能会挂起。
- 重新部署扩展可能会在通知中心中禁用它。
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
对我来说有效 :)
NSLog
才会起作用。如果您运行的是应用程序扩展而不是容器,则无法使用它。 - JaredH基于Michael的建议和Apple的文档, 最终让我能够在调试区域看到日志的方法是:
在模拟器中构建并运行应用程序扩展,并在提示选择主机应用程序时选择要从中调用扩展的特定应用程序。 在我的情况下,我通过在PDF上拉出共享表单来从Safari启动我的Action扩展。
之前不起作用的是遵循其他人使用Today作为主机的建议,然后离开该应用程序并转到Safari调用我的扩展程序。 我甚至不再需要在运行扩展程序之前先运行包含应用程序。
来自Apple文档:
在您的扩展方案的Run阶段,您将指定一个主机应用程序作为可执行文件。通过访问该指定主机的UI来访问扩展程序,Xcode调试器会附加到扩展程序。
Xcode 8 能够调试扩展:
结果:断点和日志与平常一样工作。
UILabel
。通常我称之为logLabel
。然后可以更新该标签的文本以记录任何想要记录的日志语句。这种方法如果需要记录来自不同类实例的语句并不是很好。显然,它会使您的用户界面变得混乱。但是,如果您有一个相当简单的小部件,并且不介意轻微的UI混乱,那么这个技巧就能解决问题。我尝试了本讨论中提到的所有其他解决方案,但遗憾的是,它们都对我无效。我实际上在Xcode 6.3中很简单地使日志运行。首先,构建并运行包含应用程序。一旦包含应用程序在设备上运行,通过将方案更改为应用程序扩展来构建并运行应用程序扩展。