URLスキームからのスマフォアプリ起動のフォールバック
Posted: Updated:
前段
ブログリハビリ..._:(´ཀ`」 ∠):
- URLスキームで任意のアプリ(今回はLINE)を起動したい
- フォールバックとして、アプリのURLに誘導するなりアラートするなりしたい
Android
Galaxy S3 (4.0.3) と Xperia SX (4.1.2) のAndroidブラウザで確認する限りは、下記のようなコードで実現できた。
var iframe = document.createElement('iframe'); iframe.className = 'is-hidden'; iframe.onload= function() { alert('LINEアプリ、インストールしてなくない?'); iframe.parentNode.removeChild(iframe); }; iframe.src = 'line://msg/text/loremipsum...'; document.body.appendChild(iframe);
別アプリを開くことに成功したら、onload
も発火しないようなのでかなりシンプルに処理できる。ボタンバナーのclickイベントをトリガーに、上記のような処理を実行すれば良い。
iOS
こっちのほうがめんどうな感じ。前項のiframe.onload
路線が難しそうだったので、タイマー路線でいじくりまわしていた。最終的にはStackOverflowに同じような内容のポストがあったので、それを参考に下記のようなコードになった。
var iframe = document.createElement('iframe'); var start = Date.now(); iframe.className = 'is-hidden'; setTimeout(function() { var diff = Date.now() - start; if (diff < 2000) { // alert('hogehoge'); window.location.href = 'LINEのアプリURL'; } iframe.parentNode.removeChild(iframe); }, 500); iframe.src = 'line://msg/text/hogehoge'; document.body.appendChild(iframe);
URLスキームでアプリの立ち上げに実行すれば、タイマー内の時間判定よりも前に、別アプリへ移動するため、戻ってきた頃にはタイマー内の判定がfalseとなる。逆に、アプリが立ち上がらなければ、順当に500ms後のタイマー内判定がtrueとなり、そこでフォールバックを行える。
iOSでは無効なURLをくわせると「ページを開けません」ダイアログが出る。すぐにwindow.location
にURLを入れると、ダイアログが消えてそのまま、たとえばAppStoreなどの遷移先に移動するので問題ない。
しかし、alert
によるメッセージ提示にすると、下記のような感じで鬱陶しさが増す。
- デフォルトの「ページを開けません」ダイアログ
- コード中で「alertに食わせたテキスト」ダイアログ
- デフォルトの「ページを開けません」ダイアログ
もうこれ、小細工せず素直に「ページを開けません」ダイアログだけで済ませれば良いですね。iframeでやってる限りは、親windowが現在地から下手に移動することもないですし。
ここではLINEのアプリをインストールさせることは目的でなく、ていうかLINE使ってるかどうかくらいユーザーにとって自明だしー。
参考
というような感じでした。Stack Overflowさんあざーす。