- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
在iOS 8 扩展程序的viewDidLoad
中。 NSLog
在Xcode中没有输出任何内容。 NSLog
在容器应用程序中照常工作。
如何从扩展程序获取调试消息的输出?
答案 0 :(得分:94)
调试应用扩展程序的步骤:
运行容器应用。在此步骤中,Xcode将容器应用程序和应用程序扩展上载到设备或模拟器。
停止容器应用。在模拟器中调试时,此步骤很重要。如果你不这样做,Xcode会告诉你模拟器正在使用中。
在Xcode中,按菜单Debug - >附加到流程 - >通过Process Identifer(PID)或Name ...,输入app ext的标识符,例如, com.abc.ContainerApp.MyExtension,开始调试。不要忘记设置断点。 (2014年8月25日更新:您可以直接输入MyExtension(您的扩展程序名称)。)
在设备或模拟器中,打开您的应用扩展程序。
我发现上面的调试步骤在模拟器上使用iOS 8 SDK beta 5的Xcode 6 beta 6上运行不正常。
解决方案:
断点有效。但我不知道为什么日志不会出现在输出窗口中。
答案 1 :(得分:49)
我也有这个问题。如果你在菜单Debug - >下进入模拟器,它对我有用。打开系统日志...
从这里你可以看到iPhone模拟器的所有日志(包括扩展程序的日志)。
答案 2 :(得分:32)
NSLog
正在完美。
您只是看不到Xcode调试区域中记录的内容,因为Xcode调试器未附加到您的扩展。扩展程序几乎完全独立于其包含的应用程序。例如,它们具有单独的包标识符,它们也是操作系统上的单独进程。
我在使Xcode附加到扩展程序方面取得了不同程度的成功。据说它似乎会自动附加,它在调试导航器中显示为“等待附加”,但从不附加。
有时,我可以在Xcode中运行我的扩展目标:
然后可以选择运行我的扩展程序的应用程序。在这种情况下,我会选择“今天”的建议,即通知中心。
然后它会有时将调试器附加到我的扩展程序。请注意,此方法仅适用于物理设备。
如果没有附加,您可以在@ VinceYaun的回答
中使用手动附件方法我使用其他附着方法也取得了不同的成功。大多数都没有成功,似乎它们只是将在以后修复的错误。
要查看您的日志消息,请转到Window
- >顶部栏中显示Devices
,然后选择您的设备。您可以从该窗口的底部调出设备日志。如果您在模拟器上进行测试,可以使用@ BalestraPatrick的answer。
Beta 2中已经修复了一些错误,我猜测最终调试器会在启动扩展时自动附加。
更新:在iOS 8 Beta 4中release notes:
扩展
已修复测试版4
- 从Xcode调试时,扩展有时无法启动。
- 当使用UI进行扩展时,它会重新启动并且不会被解除。
- 有时您的共享或操作扩展程序可能会挂起。
- 重新部署扩展程序可能会在通知中心中将其禁用。
答案 3 :(得分:18)
我也有这个问题。 Xcode从不将我的调试器附加到扩展或显示NSLog消息。如果您将Xcode调试器手动附加到扩展过程,至少断点就像魅力一样:
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
答案 4 :(得分:12)
对我有用:)
答案 5 :(得分:3)
Xcode 8能够调试扩展:
结果:断点和日志照常工作。
答案 6 :(得分:3)
最终允许我根据Michael's suggestion和Apple's documentation查看调试区域中的日志是:
Build&在模拟器中运行应用扩展程序,当系统提示您输入主机应用时,从中选择您要调用扩展程序的特定应用。在我的情况下,我通过在PDF上提取共享表来从Safari启动我的Action扩展。
之前没有工作的是遵循其他人使用今天作为主持人的建议,但随后离开该应用程序并转到Safari来拨打我的分机。在运行扩展程序之前,我甚至不需要先运行我的包含应用程序。
来自Apple的文档:
在扩展方案的“运行”阶段,您将主机应用程序指定为可执行文件。在通过指定主机的UI访问扩展时,Xcode调试器将附加到扩展名。
答案 7 :(得分:1)
我实际上让日志在Xcode 6.3中非常简单地运行。首先,构建并运行包含应用程序。在设备上运行包含应用程序后,通过将方案更改为应用程序扩展,构建并运行应用程序扩展。
Apple has documentation directly related to debugging, profiling and testing your app extension.
答案 8 :(得分:1)
对我有用的技巧(尽管它非常难看)是在我的扩展的底角放置一个虚拟UILabel
。我通常称之为logLabel
。然后,可以使用要记录的任何日志语句更新此标签的文本。如果需要从不同类的实例中记录语句,则此方法不是很好。显然,它会使你的用户界面变得混乱。
但是,如果你有一个相当简单的小部件而你不介意UI的轻微混乱,那就可以了。我已经尝试了本次讨论中概述的所有其他解决方案,遗憾的是,它们都没有为我工作。
答案 9 :(得分:1)
调试适用于我的唯一方法是选择Debug-> Attach To Process By PID或Name 然后输入 PID 而不是扩展名。 您可以通过在设备上运行扩展来找到PID,转到Window-> Devices。找到您的设备并查看控制台。当您看到分机的名称时,其后跟5位数字。 这是PID
我还在扩展中放了一堆NSLog,以便找到PID。 这是在xCode 7
上答案 10 :(得分:1)
遇到有关NSLog
的扩展和断点的相同问题。我已经打了很多天了。
Device log
可以在以下图片中找到。它位于XCode -> Window -> Devices and Simulators
。
输入Open Console
后,对话框的右上角会显示一个搜索字段。我可以在那里应用过滤规则。例如,进程名称包含Notification
关键字,或进程名称必须等于扩展目标的名称,例如:等于MyNotificationServiceExtension
进程名称。
答案 11 :(得分:0)
从Xcode 6 Beta 5开始,我已经能够使用运行iOS8的实际设备来调试我的扩展。尝试在设备上运行它,然后选择Safari启动进入
答案 12 :(得分:0)
显然Xcode6-B5中有些东西被破坏了。
如果我尝试在模拟器上运行Photo扩展程序,我看不到任何Photos.app作为扩展程序附加过程的选项。
同样,在真实设备上运行,给我正确的行为。
在第一种情况下,任何断点都不受尊重。在后一种情况下,断点就像一个魅力。
答案 13 :(得分:0)
你应该知道容器应用程序和扩展程序在iOS中完全是两个不同的过程,而LLVM一次只调试一个线程,因此在调试时,控制台永远不会记录扩展名,也不会在断点处停止。
你可以用@Vince Yuan的方法解决大部分问题。
然而,我的问题是Xcode调试器在iOS模拟器和设备上几乎没有挂钩我的键盘扩展,例如7-8次运行中的1次,这完全是概率问题。 @Vince Yuan的方法也适用于有时。
我的小经验是,当你运行调试方案时,如果左侧面板中的调试会话显示“没有调试会话”,则无需打开扩展并测试它,调试器没有挂上,只是为了幸运再次跑。
但是当你看到com.xxx.xxx.xxx正在等待Attach时,扩展肯定会被调试。
这是一个小技巧,无法调试iOS扩展,特别是键盘扩展。
答案 14 :(得分:0)
为了克服因更换IDE而导致的所有状态,我使用的是来自lemonjar.com的iOS控制台 - 它显示任何连接的iOS设备的控制台窗口,无论进程ID如何,都会呈现系统日志消息。您可以在此处同时查看应用和扩展调试日志消息。
答案 15 :(得分:0)
我可以按照下面描述的方式调试我的扩展程序:
Debug
- > Attach to process by PID or Name
。您的扩展方案名称。main app target
并运行。我希望它也适合你们。