新しいiPhoneやiOS8のリリースも正式にアナウンスされドタバタしています。
iOS8の新機能、Extension。
例えば「写真」アプリで写真を選択し、アクションボタンをタップすると
このようにTwitterやFacebookに投稿したり、印刷したりする機能が現れます。
iOS8ではアプリケーションが提供するExtensionを追加出来るようになりました。
例えばiOSが提供している以外のSNSに投稿するShare Extensionを追加したり、画像にフィルターを掛けるAction Extensionを提供したり出来るようになりました。
さて、このExtension、Appleのアナウンスではホスト・アプリを選んでXcodeで起動させればソースコードレベルでデバッグ出来る事になっているのですが、私がドキュメントをちゃんと読みこなせていないのか、なかなかうまくデバッグする事が出来ません。
そこで強引にデバッグする手法です。
まず、Extensionが稼働しているプロセスを特定するため、PIDを取得します。
viewDidLoadの最初にでも下記のようなコードを埋め込みます。
- (void)viewDidLoad { [super viewDidLoad]; #ifdef DEBUG pid_t pid; pid = getpid(); NSLog(@"%s : pid = %ld", __func__, (long)pid); #endif
次にXcodeからExtensionを実行します。
するとホストアプリをどれにするか聞いてきます。
UIActivityViewControllerを使ってAction Extensionを起動出来るアプリを選んでやります。
次にコンソールのメッセージを見るためにXcodeのWindowメニューからDeviceを選びます。
先ほどでバッグ用に起動したデバイスで目的のExtensionをタップし、Active Extensionを起動します。
コンソールには先ほどviewDidLoadに仕込んだメッセージが表示され、Prosess IDが 4924 だと判明しました。
“Debugメニュー” -> “Attache To Process” -> “By Process ID(Identifier) or Name..”
で先ほどのPIDを指定して目的のプロセスにAttacheします。
以上でブレークポイントを掛けてデバッグ出来るようになります。
ただ、この方法ではExtensionが起動した直後からデバッグを行う事は出来ません。
今回の事で分かったのは、Action Extensionはホスト・アプリの中で動いているのではなく、別プロセスとして立ち上げられていると言う事です。
これによるメリットはホスト・アプリが非常にメモリーを使う物であっても、それに影響されずメモリーなどの資源を使う事が出来ると言う事です。またAction Extensionにバグがあり、強制終了させられた場合でもホスト・アプリの動作には影響が無いのでしょう。