如何使用NSLogdebuggingiOS 8扩展?

- (void)viewDidLoad { NSLog(@"%s", __func__); // ... } 

在iOS 8 扩展的 viewDidLoad中。 NSLog在Xcode中不输出任何内容。 虽然NSLog在容器应用程序中照常工作。

如何从扩展的debugging消息中获得输出?

  1. debugging适用于应用扩展程序。
  2. 它也可以在模拟器上运行。
  3. 如果您的应用程序在模拟器中崩溃,您可能会发现重新启动应用程序分机并不容易。 重新启动你的模拟器是一个快速的解决scheme。
  4. debugging应用程序扩展的步骤:

    1)运行容器的应用程序。 在这一步中,Xcode将容器应用和应用扩展上传到设备或模拟器。

    2)停止容器应用程序。 在模拟器中debugging时,这一步很重要。 如果你不这样做,Xcode会告诉你模拟器正在使用中。

    3)在Xcode中,按菜单debugging – >附加到进程 – >按进程标识符(PID)或名称…,input应用程序分机的标识符,例如com.abc.ContainerApp.MyExtension,开始debugging。 不要忘记设置中断点。 (2014年8月25日更新:您可以直接inputMyExtension(您的分机名称)。)

    4)在设备或模拟器中,打开您的应用程序扩展。


2014年8月23日更新:

我发现上面的debugging步骤在模拟器上的iOS 8 SDK beta 5的Xcode 6 beta 6上不能正常工作。

解:

  1. 在模拟器中运行你的扩展。
  2. Xcode菜单debugging – >附加到进程 – >在菜单的系统部分select“MyExtension(你的扩展的名称)”。

断点工作。 但我不知道为什么日志不显示在输出窗口中。

我也有这个问题。 它适用于我,如果你进入你的模拟器下的菜单debugging – >打开系统日志…

从这里你可以看到iPhone模拟器的所有日志(包括你的扩展的日志)。

在这里输入图像说明

NSLog工作正常。

您只是看不到Xcode的debugging区域中logging了什么,因为Xcodedebugging器没有附加到您的扩展。 扩展程序几乎完全独立于其包含的应用程序。 例如,它们具有单独的捆绑标识符,而且它们在操作系统上也是单独的进程。

我已经有了不同的成功,让Xcode附加到扩展。 据推测,它似乎会自动附加,并在debugging导航器中显示为“等待附加”,但从不附加。

有时候,我可以在Xcode中运行我的扩展目标:

在这里输入图像说明

然后可以select在哪个应用程序中运行我的扩展程序。在这种情况下,我会select它的build议“today”,它是通知中心。

在这里输入图像说明

然后它有时会将debugging器附加到我的扩展。 注意这个方法似乎只适用于物理设备。

如果没有附加,你可以在@ VinceYaun的答案中使用手动附件方法,

我也使用其他附件方法取得了不同的成功。 大部分都是不成功的,看起来它们只是后来修复的一些bug。

要查看日志消息,请转到顶部栏中的Window – > Devices ,然后select您的设备。 您可以从该窗口的底部调出设备日志。 如果你正在模拟器上testing,你可以使用@BalestraPatrick的答案 。

一些错误已经在Beta 2中修复了,我的猜测是最终debugging器在启动扩展时会自动附加。

更新:在iOS 8 Beta 4 发行说明中 :

扩展

在beta 4中修复

  • 从Xcodedebugging时,扩展有时无法启动。
  • 当使用UI的扩展被终止时,它重新启动并且不被解雇。
  • 有时您的共享或操作扩展可能会挂起。
  • 重新部署扩展可能会在通知中心中将其禁用。

我也有这个问题。 Xcode不会将我的debugging器附加到扩展或显示NSLog消息。 如果您将Xcodedebugging器手动附加到您的扩展进程中,则至less断点工作起来就像一个魅力:

 Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension") 
  1. 为您的扩展创buildscheme
  2. 运行计划
  3. 在对话框中select容器应用程序
  4. 请享用

适用于我 🙂

Xcode 8能够debugging扩展:

  1. 在停止button旁边的combobox中select扩展scheme并运行它。
  2. 在出现的对话框中select父应用程序。

结果:断点和日志照常工作。

实际上,我在Xcode 6.3中获得了相当简单的日志。 首先,构build并运行包含的应用程序。 一旦包含应用程序在设备上运行,通过将scheme更改为应用程序扩展来构build和运行应用程序扩展。

苹果公司有debugging,分析和testing你的应用程序扩展直接相关的文档。

debugging工作的唯一方法是selectDebug-> Attach To Process By PID或Name然后inputPID而不是扩展名。 您可以通过在设备上运行扩展来findPID,然后转到“窗口” – >“设备”。 find您的设备并查看控制台。 当你看到你的分机的名字,其后跟5位数字。 这是PID

我也把一堆NSLog的扩展名为了findPID。 这是在xCode 7上

根据Michael的build议和苹果的文档 ,最终让我看到debugging区域的日志是:

在模拟器中构build并运行应用程序扩展,并在系统提示您提供主机应用程序时, select要从中调用扩展的特定应用程序 。 在我的情况下,我通过在PDF上提取分享表来从Safari启动Action扩展。

以前不工作的是遵循其他人使用Today作为主持人的build议,但随后离开该应用程序并转到Safari以致电我的分机。 运行扩展之前,我甚至不再需要运行我的包含应用程序。

从Apple的文档:

在您的扩展scheme的运行阶段,您指定一个主机应用程序作为可执行文件。 通过指定主机的UI访问扩展后,Xcodedebugging器将附加到扩展。

很明显,Xcode6-B5中有些东西被破坏了。

如果我尝试在模拟器上运行照片扩展名,我看不到任何Photos.app作为扩展附加过程的选项。

在模拟器内调试选项

同样,在真实的设备上运行,给我正确的行为。

调试选项与一个真实的设备

在第一种情况下,任何断点都不受尊重。 在后一种情况下,断点就像一个魅力。

您应该知道容器应用程序和扩展在iOS中完全是两个不同的过程,而LLVM一次只debugging一个线程,因此在debugging时,控制台不会logging扩展,也不会在断点停止。

你可以用袁媛的方法解决大部分的问题。

然而,我的问题是,Xcodedebugging器很难挂在我的键盘扩展在iOS模拟器和设备上,如7-8次运行1次,这完全是一个概率问题。 @袁子的方法也有时候有用。

我的一点经验是,当你运行你的debuggingscheme时,如果在左侧面板中的debugging会话显示'没有debugging会话',没有必要打开你的扩展并testing它,debugging器没有挂接,只是运行再次为幸运。

但是当您看到com.xxx.xxx.xxx正在等待Attach时,扩展名肯定会被debugging。

这是一个小技巧,无法debuggingiOS扩展,尤其是键盘扩展。

从Xcode 6 Beta 5开始,我已经能够使用运行iOS8的实际设备来debugging我的扩展。 尝试在设备上运行它,然后selectSafari以启动

为了克服不断变化的IDE所造成的所有状态,我使用了lemonjar.com的iOS控制台 – 它为所有连接的iOS设备呈现一个控制台窗口,呈现系统日志消息而不pipe进程ID。 您可以在此处同时看到应用程序和扩展程序debugging日志消息。

一个适合我的技巧(虽然这是一个相当丑陋的)是在我的扩展的底angular放置一个虚拟的UILabel 。 我通常把它logLabel 。 然后可以使用任何要logging的日志语句来更新此标签的文本。 如果您需要从不同类的实例logging语句,这种方法不是很好。 显然,这会让你的界面变得混乱。

但是,如果你有一个相当简单的小部件,你不介意关于UI的轻微混乱,这是不可能的。 我尝试了这个讨论中提出的所有其他解决scheme,可悲的是,他们都没有为我工作。