iPhone
iOS
iOS9
UniversalLinks

Universal Links に対応するときに考慮したいこと

More than 3 years have passed since last update.

この記事は Wantedly Advent Calendar 7日目の記事です。

旬が過ぎた感がありますが、Universal Links の話です。Wantedly でも対応しました。例えば、メールに含まれる募集リンクをタップするとアプリで募集が開くようになっています。

とりあえず動かすところまでは Apple のドキュメントやQiitaの記事を参考にすんなり行ったのですが、そこから先もいくつか難しい点がありました。対処を考えたものは対処方法と一緒に書いておきます。


TL; DR


  • 開くページと開かないページを細かく区別することは現状難しい

  • さくっと導入できるかは、ウェブとアプリの機能の違いや、URL構造などによる

  • ウェブページが開くところすべてで Universal Links が起動するわけではない


JSONに記述するパス

どのページをアプリで開くかという話です。


基本的な方針

まず、基本方針として以下の二つのどちらかを選ぶことになると思います。


  1. 開きたいページだけリストに書く(ホワイトリスト)

  2. まず全てを開いて、開けないページだけアプリからSafariに制御を戻す(ブラックリスト)

アプリは機能を削ったものを出しているというような場合、ウェブにはあるけどアプリには対応する画面がないようなページが結構あると思います。その場合は1の方法が良いと思います。

2の場合は渡ってきたURLが開けない場合は、Safariで開くコードを書きます(この時、再び Universal Links が起動して無限ループにならないか、という懸念がありましたが、ならないことを確かめました)。

この場合の挙動ですが、一度アプリに遷移し直後にSafariに遷移するというようなアニメーションになります。iOS9からアプリ間遷移は右からPushされるアニメーションになりましたが、それが連続して起こります(個人的には思ったよりシームレスでした)。


ホワイトリストの場合

いまのところ表現できるパターンが貧弱(全てにマッチ*と一文字マッチ?のみ)なので、できないことがあります。URLに特定のパラメータが含まれるかを見ることはできないのと、パスで判定する場合も、次のような場合は難しいです。



  • /companies/123 はアプリで開きたい


  • /companies/123/employees/1 はアプリで開きたくない(開けない)

この場合は、どちらも開かないという判断をするか、一旦 /companies/* をアプリで開くようにして、開けない場合は Safari に制御を戻す必要があります。


Universal Links の起動する文脈

現状、Universal Links の起動する文脈がちょっと分かりにくいという話です。


Safari での遷移

以下は、基本的には WebView も同じだと思います。


  • リンクをタップしたら起動する


    • ただし、同一ドメイン内での遷移では起動しない



  • Safari の「戻る」にも同様のトリガーがある(9.1で修正された模様)

また、Facebook でも Twitter でも WebView を最初に開く時点では Universal Links は起動しませんでした。


ラベルと実装の問題

Universal Links は openURL: でも起動しますが、これを呼ぶアクションボタンのラベルが「Safari で開く」だったりすると、Safari で開くと言いつつアプリで開く…ということになります。逆に openURL: っぽく見えても違う実装だから起動しない(例:Googleアプリの検索結果)パターンもあります。


その他

以下は Universal Links をデバッグする上で知っておいた方がいいです。

また、Handoff に対応している場合には別の落とし穴があるようなので、読んでおいた方が良さそうです。