LoginSignup
15
10

More than 5 years have passed since last update.

Containing AppとApp Extensionを同時にデバッグする

Last updated at Posted at 2018-09-30

はじめに

Containing Appをデバッグ実行した時に
同時にApp Extensionのデバッグもする方法を纏めます。

サンプルの構成

サンプルアプリは、以下の構成とします。

Category Target name Description
Containing App iOSTodayExtension 拡張元のアプリ
(開発するアプリ)
App Extension TodayEx Today Extension

何も考慮せずデバッグ実行する(失敗ケース)

TodayViewController.swift
extension TodayViewController: NCWidgetProviding {

    func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
        label.text = TodayViewData.fetchMessage()
        completionHandler(NCUpdateResult.newData)
    }

    func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
        switch activeDisplayMode {
        case .compact:
            preferredContentSize = maxSize
        case .expanded:
            preferredContentSize = CGSize(width: 0, height: expandedContentHeight)
        }

        // iOSTodayExtension(Containing App)実行時は、以下のデバッグログはコンソールに表示されない
        print("NCWidgetDisplayMode: \(activeDisplayMode)")
        print("preferredContentSize: \(preferredContentSize)")
    }
}

TodayEx側のコードに上記の通り、print文を書いてみたところ、

「TodayEx」を実行してwidgetの表示を増やしたり減らしたりしたところ、コンソールにログを出力できました。
また、上記TodayViewController内にブレイクポイントを設定したところ、ちゃんと停止しました。

NCWidgetDisplayMode: NCWidgetDisplayMode
preferredContentSize: (0.0, 200.0)
NCWidgetDisplayMode: NCWidgetDisplayMode
preferredContentSize: (398.0, 105.0)

しかし、「iOSTodayExtension」を実行して同様にwidgetの表示を増やしたり減らしたりしたところ、
コンソールにログが出力されませんでした。
また、ブレイクポイントを設定しても停止しませんでした。

プロセスにアタッチする

Containing AppとApp Extensionは、別のプロセスで動作するため
「iOSTodayExtension」実行時は、「TodayEx」の方はprint文の内容をコンソールに出力したり
ブレイクポイントで停止したりしていないようでした。

「iOSTodayExtension」実行後、

Debug > Attach to Process by PID or Name...
もしくは
Debug > Attach to Process
で、アタッチします。(以下のイメージは、「Attach to Process by PID or Name...」を選択した場合)

ブレイクポイントで停止するようになりました!

しかし、print文の内容は出力できておらず、これだけでは
毎回lldbのコマンドで値を出力させなければなりません。

ブレイクポイントを編集してログを出力する

print文は機能しませんでしたが、ブレイクポイントは機能するようになったので
ブレイクポイントにログを設定することでコンソールにログを出力することができます。


一番下の「Automatically continue after evaluating actions」にチェックを付けることで、
ログを出力後処理を停止しないようになります。

まとめ

Containing Appをデバッグ実行中にApp Extension側のデバッグをするには...

  1. Debug > Attach to Process by PID or Name...(もしくはDebug > Attach to Process)からApp Extensionのプロセスにアタッチする
  2. ブレイクポイントを編集して、ログを出力する
15
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10