- (void)viewDidLoad
{
NSLog(@"%s", __func__);
// ...
}
iOS 8のviewDidLoad
で拡張子。 NSLog
はXcodeで何も出力しません。 NSLog
は、コンテナアプリでも通常どおり機能します。
拡張機能からデバッグメッセージから出力を取得するにはどうすればよいですか?
アプリ拡張機能をデバッグする手順:
コンテナアプリを実行します。このステップでは、Xcodeがコンテナーアプリとアプリ拡張機能をデバイスまたはシミュレーターにアップロードします。
コンテナアプリを停止します。このステップは、シミュレータでデバッグするときに重要です。実行しない場合、Xcodeはシミュレータが使用中であることを通知します。
Xcodeで、メニューの[デバッグ]-> [プロセスにアタッチ]-> [プロセスID(PID)または名前で...]を押して、アプリ内線の識別子を入力します。 com.abc.ContainerApp.MyExtension、デバッグを開始します。ブレークポイントを設定することを忘れないでください。 (2014年8月25日に更新:MyExtension(拡張機能の名前)を直接入力できます。)
デバイスまたはシミュレーターで、アプリ拡張機能を開きます。
上記のデバッグ手順は、シミュレータ上のiOS 8 SDKベータ5を使用したXcode 6ベータ6ではうまく機能しないことがわかりました。
解決:
ブレークポイントは機能します。しかし、ログが出力ウィンドウに表示されない理由はわかりません。
私もこの問題を抱えています。 [デバッグ]-> [システムログを開く...]の下のシミュレータに移動すると、うまくいきます。
ここから、iPhoneシミュレーターのすべてのログ(拡張機能のログを含む)を確認できます。
NSLog
は正常に動作しています完璧に。
Xcodeデバッガーが拡張機能にアタッチされていないため、Xcodeのデバッグ領域に記録されているものが表示されません。拡張機能はほぼ含まれているアプリから完全に独立しています。たとえば、個別のバンドル識別子があり、OS上の個別のプロセスでもあります。
Xcodeを拡張機能にアタッチするには、さまざまな成功がありました。おそらく、自動的にアタッチされるようであり、デバッグナビゲーターには「Waiting to attach」と表示されますが、アタッチされません。
Xcodeで拡張ターゲットを実行できる場合があります。
そして、拡張機能を実行するアプリケーションを選択するオプションがあります。この場合、通知センターである「今日」の推奨を選択します。
そして、それは時々デバッガを私の拡張機能にアタッチします。この方法は物理デバイスでのみ機能することに注意してください。
添付しない場合は、@ VinceYaunの回答で手動の添付方法を使用できます。
また、他のアタッチメント方法を使用してさまざまな成功を収めました。ほとんどは成功していません。それらはバグであり、後日修正される予定です。
ログメッセージを表示するには、トップバーのWindow
-> Devices
に移動し、デバイスを選択します。そのウィンドウの下部からデバイスログを表示できます。シミュレーターでテストする場合は、@ BalestraPatrickの answer を使用できます。
いくつかのバグはBeta 2で修正されており、私の推測では、拡張機能を起動すると、最終的にデバッガーが自動的にアタッチされます。
更新:iOS 8 Beta 4で リリースノート :
拡張機能
ベータ4で修正
- Xcodeからのデバッグ時に拡張機能の起動に失敗することがあります。
- Extension with UIが強制終了されると、再起動され、却下されません。
- 共有またはアクション拡張機能がハングすることがあります。
- 拡張機能を再展開すると、通知センターで拡張機能が無効になる場合があります。
私もこの問題を抱えています。 Xcodeがデバッガを拡張機能にアタッチしたり、NSLogメッセージを表示したりすることはありません。 Xcodeデバッガーを拡張プロセスに手動で接続すると、少なくともブレークポイントは魅力のように機能します。
Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
それ私のために働く :)
Xcode 8は拡張機能をデバッグできます。
結果:ブレークポイントとログは通常どおり動作します。
Michaelの提案 および Appleのドキュメント に基づいて、最終的にデバッグ領域でログを表示できるようになったのは次のとおりです。
シミュレーターでアプリ拡張機能をビルドして実行し、ホストアプリのプロンプトが表示されたら、拡張機能を呼び出す特定のアプリを選択します 。私の場合、PDFの共有シートを取得して、SafariからAction拡張機能を起動していました。
以前は機能していなかったのは、ホストとしてTodayを使用するという他の人の提案に従うが、そのアプリを離れてSafariに行き、私の拡張機能を呼び出すことでした。拡張機能を実行する前に、含まれているアプリを最初に実行する必要はありません。
Appleのドキュメントから:
拡張スキームの実行段階では、ホストアプリを実行可能ファイルとして指定します。指定されたホストのUIを介して拡張機能にアクセスすると、Xcodeデバッガーは拡張機能にアタッチします。
私にとってうまくいくトリックは(非常にいものですが)、ダミーのUILabel
を私の拡張機能の下隅のどこかに配置することです。私は通常それをlogLabel
と呼びます。その後、ログに記録するログステートメントでこのラベルのテキストを更新できます。異なるクラスのインスタンスからステートメントをログに記録する必要がある場合、このようなアプローチはあまり良くありません。そして、明らかに、それはあなたのUIを混乱させます。
ただし、かなりシンプルなウィジェットを使用していて、UIが少し乱雑にならない場合は、これでうまくいきます。私はこの議論で概説された他のすべての解決策を試しましたが、悲しいことに、それらのどれも私のために働きませんでした。
デバッグが機能する唯一の方法は、「デバッグ」->「PIDまたは名前でプロセスにアタッチ」を選択してから、拡張子名ではなくPIDを入力することです。デバイスで拡張機能を実行してPIDを見つけるには、[ウィンドウ]-> [デバイス]に移動します。デバイスを見つけて、コンソールを表示します。拡張機能の名前が表示されたら、その後に5桁の数字が続きます。 PIDです
また、PIDを見つけるために、拡張機能にNSLogの束を入れました。これはxCode 7にあります
Xcode 6.3では、実際にログを非常に簡単に実行できます。まず、含まれているアプリをビルドして実行します。収容アプリがデバイスで実行されたら、スキームをアプリ拡張に変更してアプリ拡張をビルドおよび実行します。
IDEの変更によって引き起こされるすべての状態を克服するために、lemonjar.comのiOSコンソールを使用しています。プロセスIDに関係なく、syslogメッセージを表示する接続されたiOSデバイスのコンソールウィンドウを表示します。ここで、アプリと拡張機能の両方のデバッグログメッセージを一度に表示できます。
Xcode 6 Beta 5の時点で、iOS8を実行している実際のデバイスを使用して拡張機能をデバッグできました。デバイスで実行し、Safariを選択して起動します
コンテナアプリと拡張機能はiOSの完全に2つの異なるプロセスであり、LLVMはスレッドを1回だけデバッグするため、デバッグ中にコンソールは拡張機能を記録せず、ブレークポイントで停止することはありません。
@Vince Yuanの方法でほとんどの問題を解決できます。
ただし、私の問題は、XcodeデバッガーがiOSシミュレーターとデバイスの両方でキーボード拡張機能をほとんどフックしないことです(7-8回に1回実行されるなど)。これは完全に確率の問題です。 @Vince Yuanのメソッドは、たまにしか機能しません。
私の小さな経験では、デバッグスキームを実行すると、左パネルのデバッグセッションに「デバッグセッションなし」と表示されている場合、拡張機能を開いてテストする必要はなく、デバッガーはフックしませんでした再び幸運のために。
しかし、com.xxx.xxx.xxxがAttachを待っているのを見ると、拡張機能は間違いなくデバッグされる可能性があります。
これはiOS拡張機能、特にキーボード拡張機能をデバッグできない人にとってはちょっとしたトリックです。
以下で説明する方法で拡張機能をデバッグできます。
Debug
-> Attach to process by PID or Name
。拡張スキーム名。main app target
を選択して実行します。それが皆さんにも役立つことを願っています。
Xcode6-B5で明らかに何かが壊れています。
シミュレータで写真の拡張機能を実行しようとすると、拡張機能の接続プロセスのオプションとしてPhotos.appが表示されません。
同じことを実際のデバイスで実行すると、正しい動作が得られます。
最初のケースでは、ブレークポイントは尊重されません。後者の場合、ブレークポイントはチャームのように機能します。