2015年1月31日土曜日

Web MIDI Browser 1.0.1


Web MIDI Browser has been updated to 1.0.1. This new version includes an “Action Extension”. The Action Extension will let you launch the app from Action Menu in Mobile Safari. And then, Web MIDI Browser will automatically open the URL which is being opened in Safari at the time. The app’s functionalities are not enough for usual web browsing. So, I suggest
  • Use Safari in usual
  • Use Web MIDI Browser for web sites using Web MIDI API (You can smoothly launch the app from Action Menu)
And a small bug was fixed. Enjoy!

Web MIDI Browser のバージョン 1.0.1 をリリースしました。このバージョンには、”Action Extension” が同梱されています。Action Extension を使うと、iOS 標準のブラウザ Safari のアクションメニューから、このアプリを起動することができます。この時、Safari が開いている URL を自動的に開いてくれます。Web MIDI Browser のブラウザとしての機能は貧弱です。そのため、
  • 普段のウェブブラウズはもちろん Safari で
  • Web MIDI API を使ったサイト開くときだけアクションメニューから Web MIDI Browser にスイッチする
という使い方が良いと思います。

また、このバージョンで、小さなバグを直しました。
ご要望などあればぜひお知らせください。



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 に投稿する→投稿した


2015年1月1日木曜日

iOS 8 Safari Action Extension でハマる

Safari Action Extension でハマる

iOS 8 から、Safari Action Extension という、Mobile Safari のアクションメニューからプラグインのようにサードパーティアプリのコンポーネントを呼び出す拡張機能を提供できるようになった。早速これを使ってみようと思っていろいろ試したが結局使えなかった、という話。  →結局解決

Language: Swift を選択して生成した Action Extension のテンプレートが動かない

まず最初にハマったのが、Action Extension のテンプレートを生成するところで、Language: Swift を選んだところ、これが思うように動かない。具体的には、NSItemProvider の loadItemForTypeIdentifier の completionHandler が呼ばれない。結果、生成されるサンプルコード(DOM を操作して、背景色を赤にする)もちゃんと動いていない。

この問題は、テンプレート生成時に Language: Objective-C にすることで解決。Xcode 6.2 beta 3 でも再現するので Apple へバグレポートするかな...

Safari Action Extension からは Open URL できない

Extension のテンプレートは動くようになったので、本当にやりたかった、Extension から他のアプリの起動を試す。しかし、うまくいかない。まず、openURL: を使うために、UIApplication.sharedApplication が必要になるが、これにアクセスできない。まぁ、これは Extension のアーキテクチャから考えてもなんとなく想像できた。

Extension が起動されるときには、NSExtensionContext のインスタンスが渡されてきて、このインスタンスメソッドに openURL: がある。これだ!と思いきや、うまくいかない。NSExtensionContext の openURL: は、Today Extension からでないと使えないように制限がかけられている。
http://stackoverflow.com/questions/24297273/openurl-not-work-in-action-extension

で、この記事でも紹介されていた hack、UIWebView を経由して URL scheme をキックする方法を試したが、iOS 8.1.2 では弾かれてしまう。まぁ、仮に上手く動いたとしても、そもそも前述の openURL: の振舞いから想像するに、明確な設計思想による制約のようなので、App Review をパスできるかどうか微妙。

まとめ

結局、Action Extension から外部アプリを起動することはできなかった。
→解決しました