2015年1月8日木曜日

iOS 8 Safari Action Extension でハマる - 解決編

iOS 8 Safari Action Extension でハマる - 解決編

先日の記事で、iOS 8 Safari Action Extension から、URL Scheme を使ったアプリ起動に失敗した件、結局解決できたので追記。

non-UI Extension 用に用意されている JavaScript アダプタ内で location.href を書き換え

Action Extension には、UIを提供するタイプ("Presents User Interface") のものと、UIを提供しないもの("No User Interface") の 2 種類がある。後者の場合、Safari から Extension が
起動されたときに、Extension にバンドルされた JavaScript がロードされるようになっている。この JavaScript では、Pre 処理と Post 処理を記述できるようになっている。Pre 処理 (ExtensionPreprocessingJS.run 関数)で、DOM から必要な要素をピックアップし、Native 側に渡す。で、Native 側で必要な処理を行い、Post 処理(ExtensionPreprocessingJS.finalize)に渡して DOM へ変更を反映するという設計思想。
この Post 処理の中で、location.href を変更すれば、Safari が URL scheme をキックしてくれるので、マッチした URL scheme が登録されているアプリを起動できる。

実装方法

JavaScript を Action.js として Extension にバンドルする。

Safari の Action Menu を開き、作成した Extension のアイコンをタップすると、-(void)beginRequestWithExtensionContext: が呼びだされる。Native 側では特になにもせず、completion handler を呼びだすだけ。ただ、completeRequestReturningItems に、適当なパラメータを渡してやらないと、なぜか、ExtensionPreprocessingJS.finalize() が呼ばれなかった。

もうちょっとシンプルな方法がありそうだけど、ひとまず目的は達成。あとで内容を整理して、Qiita に投稿する→投稿した


0 件のコメント:

コメントを投稿