web-dev-qa-db-ja.com

NSLogを使用してiOS 8拡張機能をデバッグする方法

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

iOS 8のviewDidLoad拡張子NSLogはXcodeで何も出力しません。 NSLogは、コンテナアプリでも通常どおり機能します。

拡張機能からデバッグメッセージから出力を取得するにはどうすればよいですか?

87
ohho
  1. デバッグは、アプリ拡張機能に対して機能します。
  2. シミュレーターでも動作します。
  3. シミュレータでアプリ内線がクラッシュした場合、アプリ内線を再起動するのは簡単ではないことがわかります。シミュレータを再起動するのは簡単な解決策です。
  4. アプリ拡張機能をデバッグする手順:

    1. コンテナアプリを実行します。このステップでは、Xcodeがコンテナーアプリとアプリ拡張機能をデバイスまたはシミュレーターにアップロードします。

    2. コンテナアプリを停止します。このステップは、シミュレータでデバッグするときに重要です。実行しない場合、Xcodeはシミュレータが使用中であることを通知します。

    3. Xcodeで、メニューの[デバッグ]-> [プロセスにアタッチ]-> [プロセスID(PID)または名前で...]を押して、アプリ内線の識別子を入力します。 com.abc.ContainerApp.MyExtension、デバッグを開始します。ブレークポイントを設定することを忘れないでください。 (2014年8月25日に更新:MyExtension(拡張機能の名前)を直接入力できます。)

    4. デバイスまたはシミュレーターで、アプリ拡張機能を開きます。


2014年8月23日の更新:

上記のデバッグ手順は、シミュレータ上のiOS 8 SDKベータ5を使用したXcode 6ベータ6ではうまく機能しないことがわかりました。

解決:

  1. シミュレーターで拡張機能を実行します。
  2. Xcodeメニューデバッグ->プロセスにアタッチ->メニューの[システム]セクションで[MyExtension(拡張機能の名前)]を選択します。

ブレークポイントは機能します。しかし、ログが出力ウィンドウに表示されない理由はわかりません。

95
Vince Yuan

私もこの問題を抱えています。 [デバッグ]-> [システムログを開く...]の下のシミュレータに移動すると、うまくいきます。

ここから、iPhoneシミュレーターのすべてのログ(拡張機能のログを含む)を確認できます。

enter image description here

49
BalestraPatrick

NSLogは正常に動作しています完璧に

Xcodeデバッガーが拡張機能にアタッチされていないため、Xcodeのデバッグ領域に記録されているものが表示されません。拡張機能はほぼ含まれているアプリから完全に独立しています。たとえば、個別のバンドル識別子があり、OS上の個別のプロセスでもあります。

Xcodeを拡張機能にアタッチするには、さまざまな成功がありました。おそらく、自動的にアタッチされるようであり、デバッグナビゲーターには「Waiting to attach」と表示されますが、アタッチされません。

Xcodeで拡張ターゲットを実行できる場合があります。

enter image description here

そして、拡張機能を実行するアプリケーションを選択するオプションがあります。この場合、通知センターである「今日」の推奨を選択します。

enter image description here

そして、それは時々デバッガを私の拡張機能にアタッチします。この方法は物理デバイスでのみ機能することに注意してください。

添付しない場合は、@ VinceYaunの回答で手動の添付方法を使用できます。

また、他のアタッチメント方法を使用してさまざまな成功を収めました。ほとんどは成功していません。それらはバグであり、後日修正される予定です。

ログメッセージを表示するには、トップバーのWindow-> Devicesに移動し、デバイスを選択します。そのウィンドウの下部からデバイスログを表示できます。シミュレーターでテストする場合は、@ BalestraPatrickの answer を使用できます。

いくつかのバグはBeta 2で修正されており、私の推測では、拡張機能を起動すると、最終的にデバッガーが自動的にアタッチされます。

更新:iOS 8 Beta 4で リリースノート

拡張機能

ベータ4で修正

  • Xcodeからのデバッグ時に拡張機能の起動に失敗することがあります。
  • Extension with UIが強制終了されると、再起動され、却下されません。
  • 共有またはアクション拡張機能がハングすることがあります。
  • 拡張機能を再展開すると、通知センターで拡張機能が無効になる場合があります。
32
Santa Claus

私もこの問題を抱えています。 Xcodeがデバッガを拡張機能にアタッチしたり、NSLogメッセージを表示したりすることはありません。 Xcodeデバッガーを拡張プロセスに手動で接続すると、少なくともブレークポイントは魅力のように機能します。

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
18
Masalis
  1. 拡張機能のスキームを作成する
  2. 実行スキーム
  3. ダイアログでコンテナアプリを選択します
  4. 楽しい

それ私のために働く :)

12
Maciek Czarnik

Xcode 8は拡張機能をデバッグできます。

  1. 停止ボタンの横にあるコンボで拡張スキームを選択して実行します。
  2. 表示されるダイアログで親アプリケーションを選択します。

結果:ブレークポイントとログは通常どおり動作します。

4
Jano

Michaelの提案 および Appleのドキュメント に基づいて、最終的にデバッグ領域でログを表示できるようになったのは次のとおりです。

シミュレーターでアプリ拡張機能をビルドして実行し、ホストアプリのプロンプトが表示されたら、拡張機能を呼び出す特定のアプリを選択します 。私の場合、PDFの共有シートを取得して、SafariからAction拡張機能を起動していました。

以前は機能していなかったのは、ホストとしてTodayを使用するという他の人の提案に従うが、そのアプリを離れてSafariに行き、私の拡張機能を呼び出すことでした。拡張機能を実行する前に、含まれているアプリを最初に実行する必要はありません。

Appleのドキュメントから:

拡張スキームの実行段階では、ホストアプリを実行可能ファイルとして指定します。指定されたホストのUIを介して拡張機能にアクセスすると、Xcodeデバッガーは拡張機能にアタッチします。

4
Andrew

私にとってうまくいくトリックは(非常にいものですが)、ダミーのUILabelを私の拡張機能の下隅のどこかに配置することです。私は通常それをlogLabelと呼びます。その後、ログに記録するログステートメントでこのラベルのテキストを更新できます。異なるクラスのインスタンスからステートメントをログに記録する必要がある場合、このようなアプローチはあまり良くありません。そして、明らかに、それはあなたのUIを混乱させます。

ただし、かなりシンプルなウィジェットを使用していて、UIが少し乱雑にならない場合は、これでうまくいきます。私はこの議論で概説された他のすべての解決策を試しましたが、悲しいことに、それらのどれも私のために働きませんでした。

1

NSLogの拡張とブレークポイントについて同じ問題に遭遇します。私は何日もそれと戦ってきました。

Device logは、次の画像にあります。 XCode -> Window -> Devices and Simulatorsにあります。

Open Consoleを入力すると、ダイアログの右上に検索フィールドがあります。そこでフィルタールールを適用できます。たとえば、プロセス名にNotificationキーワードが含まれているか、プロセス名が拡張ターゲットの名前と等しくなければなりません。例:MyNotificationServiceExtensionプロセス名と等しい。

Device log

1
AechoLiu

デバッグが機能する唯一の方法は、「デバッグ」->「PIDまたは名前でプロセスにアタッチ」を選択してから、拡張子名ではなくPIDを入力することです。デバイスで拡張機能を実行してPIDを見つけるには、[ウィンドウ]-> [デバイス]に移動します。デバイスを見つけて、コンソールを表示します。拡張機能の名前が表示されたら、その後に5桁の数字が続きます。 PIDです

また、PIDを見つけるために、拡張機能にNSLogの束を入れました。これはxCode 7にあります

1
Tony

Xcode 6.3では、実際にログを非常に簡単に実行できます。まず、含まれているアプリをビルドして実行します。収容アプリがデバイスで実行されたら、スキームをアプリ拡張に変更してアプリ拡張をビルドおよび実行します。

Appleには、アプリ拡張機能のデバッグ、プロファイリング、テストに直接関連するドキュメントがあります。

1
Michael

IDEの変更によって引き起こされるすべての状態を克服するために、lemonjar.comのiOSコンソールを使用しています。プロセスIDに関係なく、syslogメッセージを表示する接続されたiOSデバイスのコンソールウィンドウを表示します。ここで、アプリと拡張機能の両方のデバッグログメッセージを一度に表示できます。

0
igraczech

Xcode 6 Beta 5の時点で、iOS8を実行している実際のデバイスを使用して拡張機能をデバッグできました。デバイスで実行し、Safariを選択して起動します

0
Rich86man

コンテナアプリと拡張機能はiOSの完全に2つの異なるプロセスであり、LLVMはスレッドを1回だけデバッグするため、デバッグ中にコンソールは拡張機能を記録せず、ブレークポイントで停止することはありません。

@Vince Yuanの方法でほとんどの問題を解決できます。

ただし、私の問題は、XcodeデバッガーがiOSシミュレーターとデバイスの両方でキーボード拡張機能をほとんどフックしないことです(7-8回に1回実行されるなど)。これは完全に確率の問題です。 @Vince Yuanのメソッドは、たまにしか機能しません。

私の小さな経験では、デバッグスキームを実行すると、左パネルのデバッグセッションに「デバッグセッションなし」と表示されている場合、拡張機能を開いてテストする必要はなく、デバッガーはフックしませんでした再び幸運のために。

しかし、com.xxx.xxx.xxxがAttachを待っているのを見ると、拡張機能は間違いなくデバッグされる可能性があります。

これはiOS拡張機能、特にキーボード拡張機能をデバッグできない人にとってはちょっとしたトリックです。

0
Henry

以下で説明する方法で拡張機能をデバッグできます。

  1. XcodeDebug-> Attach to process by PID or Name。拡張スキーム名。
  2. 次に、main app targetを選択して実行します。

それが皆さんにも役立つことを願っています。

0
abdullahselek

Xcode6-B5で明らかに何かが壊れています。

シミュレータで写真の拡張機能を実行しようとすると、拡張機能の接続プロセスのオプションとしてPhotos.appが表示されません。

debug options within simulator

同じことを実際のデバイスで実行すると、正しい動作が得られます。

debug options withing a real device

最初のケースでは、ブレークポイントは尊重されません。後者の場合、ブレークポイントはチャームのように機能します。

0
valvoline