
リファレンスどおりに設定してもiOSで機能しない
Firebase Dynamic Linksを使ってiOSのアプリを起動する方法

はじめに
Firebaseダイナミックリンクを使うと、1つのURLで複数の遷移先を設定できて、ユーザーごとに適切な制御ができます。ダイナミックリンクによるアプリ内の画面遷移などの制御を除けば、プログラミングなしの設定のみで簡単に実現することが可能です。
例えば、以下のようなパターンです。
- iOSのブラウザでダイナミックリンクをタップすると、アプリストア(AppStore)に移動する
- iOSのブラウザでダイナミックリンクをタップすると、アプリ起動する(インストール済の場合)
- Androidのブラウザでダイナミックリンクをタップすると、アプリストア(Playストア)に移動する
- Androidのブラウザでダイナミックリンクをタップすると、アプリ起動する(インストール済の場合)
- PCのブラウザでダイナミックリンクをタップすると、アプリのランディングページに移動する
ディープリンク(DeepLink)やユニバーサルリンク(Universal links)/ アプリリンク(App Links)と混同されたりします。それぞれの違いについて関係性を概念図にしました。イメージとしては以下のとおりです。

モバイルアプリのディープリンクとは、メールやWebサイトのリンクからアプリを起動させて特定のコンテンツへ直接移動させる技術をいいます。アプリ内の遷移先まで深く辿るような意味合いから呼ばれる概念としての名称です。そのディープリンクを実行する上で、1つのURLからアプリインストールの有無で移動先を切り替えるための技術が、ユニバーサルリンク(iOS)とアプリリンク(Android)です。それぞれOSごとで呼び名が異なります。
そしてこのOS差をカバーする技術がダイナミックリンクです。iOSとAndroidのどちらの機能も備えた統合的な存在です。1つのURLでどちらのOSも対応し、本来長くなるはずのURLを短縮URLとして提供してくれます。
なおFirebase Dynamic Linksの設定方法については、以下の記事で紹介しています。
問題
Firebase Dynamic Linksのリファレンスどおりにダイナミックリンクの設定を実施しても、iOSのみアプリが起動できない問題がありました。
具体的には、アプリインストール済の状態で、ダイナミックリンクをタップしても、アプリは起動せず、Webと同様にランディングページに遷移してしまいました。
Androidは問題なくアプリ起動まで確認できるのですが、iOSのみアプリ起動が確認できません。
というのも、Firebase Dynamic Linksのリファレンスは独自ドメインで、既にユニバーサルリンクが設定されている場合に寄せた説明がされています。
※リファレンスはこちらです。
https://firebase.google.com/docs/dynamic-links
実は説明の中で触れられている apple-app-site-association というキーワードがヒントになるのですが、まさにユニバーサルリンクの部分については、iOSの範疇であることもあり、あまり詳しく触れられていません。
前述したOSごとの元々の仕様を理解していれば問題にはならないと思うのですが、いきなりダイナミックリンクをはじめるというときには、Firebaseのリファレンスだけでことが足りると感じてしまい、読み飛ばしてしまう人もいることでしょう。
解決方法
iOSでダイナミックリンクを使用する場合には、ある程度のユニバーサルリンクの設定が必要です。
本来、ユニバーサルリンクを使用する場合、アプリインストール有無で遷移先URLを切り替えるため、独自サーバー上にapple-app-site-associationを作成・配置する必要があります。
しかし、今回のFirebase Dynamic Linksを使用すれば、カスタムドメインなしの料金は無料で、そのサーバーを肩代わりしてくれるようになります。
必要な設定は以下のとおりです。
Associated Domainsにドメイン追加
Signing & Capabilitiesで、Associated Domainsを追加します。
次にDomainsにFirebase Dynamic Linksで作成されたドメインを設定します。
「applinks:」と接頭辞をつけ、ダイナミックリンクのドメインである「daiji.page.link」を追加します。

ダイナミックリンクのドメインは、Firebase Dynamic Linksの以下の画面で確認できます。

また、追加する場所は、前述のSigning & Capabilitiesからでも、*.entitlementsファイルを直接書き換えても可能です。

なお、XcodeとAppleアカウントが紐付けられていて、プロジェクトのプロファイルが紐付けられていれば、Apple Developer Consoleの「Certificates, Identifiers & Profiles」の該当アプリの「Capabilities」の「Associated Domains」もチェックが入っているはずです。

まとめ
ユニバーサルリンクに必要なAssociated Domainsの設定を追加することで、ダイナミックリンクの動作が確認できるようになりました。
ひとつのURLで複数のOSをまたがって機能を切り替えられる技術が無料で使えるのはユーザーにとっても開発者にとってもありがたいことですね。
ひとつデメリットを挙げると、リンクを解決するのにどうしても通信が伴うということです。
せっかくオフラインで動作するアプリであっても、通信が接続できない環境では機能しないことがあるため、その辺りの考慮は必要です。