Universal link に潜む罠っぽい iOS9 の仕様


iOS9 から Universal link という仕組みが導入されました。

Universal link の仕組みやアプリへの導入は @mono0926 さんによる解説がとても詳しいです。

注意
以下は iOS9.0 から iOS9.1 (+ iOS9.2 beta) の挙動に基づいて記述しています。

applink 方式 (従来方式)

これまでアプリにディープリンクする方法としては

http/https リンク → Safari で applink リダイレクト → アプリ

という経由で行っていたと思います。

しかしながら、Universal link 導入に伴い、独自スキームを使う applink は利用する折に確認ダイアログが出るようになりました。

このダイアログがリダイレクトの際に表示されることになります。

実は iOS9.0 では、このダイアログを半ば無視してアプリを切り替えることが可能でした(このハックについては後日)。しかしながら iOS9.1 以降でそのハックも利用できなくなっています。

Universal link 方式

Universal link を利用すると、この Safari 経由のアプリ遷移を飛ばして、

http/https リンク → アプリ

http/https リンクからアプリに直接切り替えることができるようになります。

この際、アプリがインストールされていれば、確認ダイアログも表示されません(http/https リンクなので、アプリがインストールされていなければ Safari に切り替わります)。

汎用的な http/https リンクをアプリ用に利用することができ、遷移もスムーズでいいことづくめな感じがするんですが、ある条件で アプリがインストールされていてもアプリに切り替わらないという罠のような仕様 があります。

Universal link でアプリを開くと……

Universal link を利用してアプリに切り替えた場合、ステータスバーの表示が変わります。

左上には、リンク元のアプリ。右上には、Universal link のドメイン。例えば twitter が対応している Universal link をメモアプリから開くと……

"Back to" と記述されていることからも分かる通り、左上のリンクは元のアプリに戻るバックボタンの役目を果たします。

右上のリンクをタップすると、対応する Universal link を Safari で開き直すことができます。

Universal link でアプリが開かない!

問題はその後です。一度この「Safariで開く」ボタンを利用すると、以降の Universal link はアプリの切り替えではなく、Safari へ切り替えに利用されるようになります。

Safari で開かれた際、アプリの方には何の通知も来ません。Safari 側で対応する Universal link のアプリを開くボタンが関連する位置にあればいいんですが、そんなものはありません。

Twitter の場合、開かれたサイトの方で従来の applink を使ったリダイレクトでアプリへの切り替えを促しています。

Universal link をアプリで再度開くようにするには……

Universal link をタップ&ホールドします。

するとアクションシートで Universal link をどのように処理するか選択することができます。

ここで「Open in "アプリ名"」の方を選択すると、Universal link がアプリで開かれるようになります。

正直とても分かりづらい仕様で、どうしてこんな実装になってしまったのかよく分からないんですが、ステータスバーを非表示すれば、これらのリンクは表示されなくなるので、それが可能なアプリであれば、Safari で開くボタンを非表示にすることは可能です。