Cordova x Crosswalk で勝手に外部ブラウザ開こうとする問題への対処法

phi phi on cordova, crosswalk

オレの Advent Calendar 2015 - Adventar の 18 日目です.

最近 phina.js と Cordova でアプリを作っているのですが, Crosswalk を導入したところ 結構重めの問題にハマったのでメモっておきます.

config.xml に外部ページを指定したら...

cordova では config.xml の content タグにルートとなる html を指定します.

<content src="index.html" />  

ここには基本 www フォルダ直下のファイルを指定するんですが, 実は http://ほにゃらら 的な ファイルも指定できます.

<content src="http://phiary.me" />  

iOS と crosswalk 導入前の Android では特に問題なく動きます.

なんか外部のアプリ開こうとするんだけど...

ただ, Crosswalk を導入すると何故か下記のような画面が開いて ブラウザを強制的に選ばされます.

ss

選ぶと当然のことながらアプリを離れて選んだブラウザ上でそのページが開きます. そう...アプリがただのショートカットに早変わり♪

cordova-plugin-crosswalk-webview と格闘

とにかく cordova には何も埋め込みたくない派の私にとってこの問題は死活問題でした. やることは一つです! 実装コードを読む!!

ってことで, cordova 用の Crosswalk pulugin である cordova-plugin-crosswalk-webview を読んでみることに.

Android Studio とかいうクソ使いづらい便利な IDE を使いひたすらデバッグです.
結構問題が根深くて, XWalkView 自体の実装とか見てたらいつの間にか Chromium の実装まで見てたり...

原因は身近なところに...

結局原因は plugin にありました. Cordova の WebView と一部同じ実装になっていなくて, 外部のアプリケーションを開きにいっちゃうってのが直接的な原因でした.

場所はこの辺ですね.

https://github.com/crosswalk-project/cordova-plugin-crosswalk-webview/blob/1.4.0/platforms/android/src/org/crosswalk/engine/XWalkCordovaResourceClient.java#L96

このメソッド自体をコメントアウトすれば, 上記の問題は解決します.

とはいっても plugin はプレーンな状態で使いたいってのがあると思うので完璧な解決にはなっていません.

私と同じような問題にハマった方が pull req 出してたりもするので次のバージョンでなおることを期待しましょう!!