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