FirebaseDynamicLinksのディファードディープリンクの検証

# Firebase Dynamic Linksは2025/8/25に廃止、2024/5の時点で新規利用開始は停止
この記事を書いて半年後くらいにシレっと発表されて、その後もそんなに大々的には告知されてないように思いますが、掲題の通りFirebase Dynamic Linksは2025/8/25に廃止されることが決定しています。
また2024/5上旬、特になんの告知もなくFirebase Dynamic Linksの新規利用開始ができなくなりました。過去にダイナミックリンク作成をしているプロジェクトの場合はこれまで通りリンクの新規作成もできるようですが、新規の利用開始はもうできません。

廃止されたあとは作成したリンクも容赦なくリンク切れになるようなので、半年から1年くらい前には代替サービスへの移行をすすめておく必要があります。

以下のリンク先にもGoogleが推奨する移行先がリストアップされてますが、実質AdjustかAppsFlyerだろうと思います。
単純にアプリを持ってない人はストアに遷移させる振り分けだけをさせたいならBitlyも選択肢に入ってきます。
ただいずれも2024/5時点では有料のサービスなので、これまでのFDL同様に無料で何とかしたいというニーズについては受け皿がない状況です

https://firebase.google.com/support/dynamic-links-faq?hl=ja



というわけで、この記事が役立つこともこの先そんなに多くないと思いますが、いちおう消さずに残しておきます

# まずはFirebase Dynamic Linksの話
**Firebase Dynamic Links**(以下 **FDL**)を使うと、端末にアプリが入ってる人には指定したアプリを開いたり、通常の起動画面とは異なるアプリ内の特定の画面（ディープリンク）を直接開かせることができます。
また、アプリをインストールしていない人にはiOS・Androidそれぞれのアプリストアに遷移させ、インストールを勧めることができます。

以前はiOS、AndroidそれぞれUniversal Links、Android アプリリンク(App Links)という別の仕組みでこういう動作を実現する必要があったんですが、FDLの登場で一元化できるようになりました。超便利。




# ディファードディープリンクって何？

ディープリンクを開こうとして端末にアプリが入ってなかったとき、FDLを使えばアプリインストールしてもらうことができますが、そのあとアプリを起動しても、もともとディープリンクで開こうとしてた画面を開くことはできません

アプリストアのダウンロードページまでは `utm_medium=hogehoge` みたいなパラメータをつけて情報を渡したりできますが、そこでアプリをダウンロードしたあと**端末上で起動されるアプリには何も情報を引き渡すことができない**からです。

しかし、これを可能にする仕組みが世の中にはあり、**ディファードディープリンク**と呼ばれています

アプリのインストール広告の成果測定はインストールして起動されたかどうかまで確認できないと困るので、AppsFlyerやAdjustのようなアプリ広告計測のソリューションは独自の技術でダウンロード後のアプリへ情報を引き継がせる機能を持っています。

そのおかげでディファードディープリンクも実現可能になっていて、実際にこれらのサービスのドキュメントにもディファードディープリンクに関するページがあります

https://www.adjust.com/ja/glossary/deep-linking#%E3%83%87%E3%82%A3%E3%83%95%E3%82%A1%E3%83%BC%E3%83%89%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%A8%E3%81%AF

https://www.appsflyer.com/ja/resources/guides/deep-linking-101/#chapter-4

# FDLでディファードディープリンクを実現できる？

実はそれらしき機能が公式のドキュメントに書かれています

https://firebase.google.com/docs/dynamic-links/use-cases/rewarded-referral?hl=ja#retrieve_referral_information_in_your_app

> 招待の受信者が紹介リンクを開くと、App Store または Play Store にリダイレクトされ、アプリがまだインストールされていない場合はインストールされます。**次に、ユーザーがアプリを初めて開いたときに、ダイナミック リンクに含めた紹介情報を取得し、それを使用して報酬を適用できます**。

書かれているのは紹介リンク、つまりFDLで作成したダイナミックリンクに含まれた紹介情報を**インストール直後のアプリへ受け渡し可能**、ということです。これができるなら、あとはアプリの実装次第でディファードディープリンクも実現可能といえます。

# iOSとAndroidでだいぶ違う

ただ、実際のところAndroidではOKなんですが、iOSはおそらく皆さんが思ってたんと違う作りになってます。

そもそもFDLの動きとして、ダイナミックリンクのURLを踏んだ後にiOSだけこういうプレビューページと呼ばれる踏み台ページがデフォルトで表示されます。

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70202/4a49fb8c-3e02-690f-f083-3d60ac3d2df9.png">

ここに英語で注釈のついた謎のチェックボックスがあります。最先端の技術を駆使して日本語に直してみましょう。

> アプリで自分の居場所を保存する
このページに進むためのリンクがコピーされます。
by DeepL

**ちょっと何言ってるかわかりません**（技術の無駄遣い)

実はチェックボックスONにした状態で「OPEN」をタップすると、**短縮URL化されていない状態のダイナミックリンクURLがクリップボードにコピーされます**。

これは公式のドキュメントにも記載されています。

https://firebase.google.com/docs/dynamic-links/link-previews?hl=ja#app_preview_pages

このURLがクリップボードに残った状態でアプリインストールして起動すると、アプリ側で情報を受け取れる仕組みになっています。この情報を使ってディープリンク遷移をさせれば、FDLを使ったディファードディープリンクがiOSでも実現できます


# ペーストボードの許可ダイアログが出てしまう

iOSでクリップボード経由の情報受け渡しをする、というやり方を見たときに、なんかイヤな予感がしたアナタ。**正解です**。

iOS 14からクリップボードのデータをアプリが取得しようとすると通知が出るようになっていましたが、**iOS 16からは許可ダイアログが出る**ようになっています。

iOS 16新機能紹介ページの「プライバシー」の章にも「ペーストボードの許可」として記載があります。

https://www.apple.com/jp/ios/ios-16/features/

実際にクリップボードにダイナミックリンクURLが残った状態でアプリを起動すると、こういう状態になります

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70202/36b59149-3d39-4a45-5665-85d2b70ff96e.png">

iOSのプライバシー系ダイアログは基本的に**許可するわけない聞き方をしてくる**ことでおなじみですが、これも例外ではありません。どう見ても**普通は「ペーストを許可しない」をタップします**。その瞬間、ディファードディープリンクの情報は破棄されて終了です。

結論として、FDLを使ってディファードディープリンクを実現しようとしても、iOSでは期待したような成果が出ない可能性が高いと考えられます。

ちなみにクリップボードにダイナミックリンクURLが残ってなければ、ペーストボードのアラートダイアログの表示なくアプリが起動します。

# FDLのプレビューページはスキップした方がいい
FirebaseコンソールでFDLのリンクを作成するとき、プレビューページをスキップするかどうか選べるようになっていて、デフォルトはOFF(＝プレビューページをスキップしない)、さらにスキップは推奨されませんと注釈がついています

<img width="６00" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70202/175e71b6-bbee-cf7c-4aae-c9c23f855d01.png">

しかしこのプレビューページを出すと、新規インストール後のアプリ起動時にペーストボードのアラートが出てしまう可能性が高く、**どう考えてもUX的によくありません**。

プレビューページが出るのはiOSだけですが、公式のドキュメントを見てもディファードディープリンクが使えないこと以外はデメリットはなさそうです。

https://firebase.google.com/docs/dynamic-links/create-manually?authuser=4#debugging_a_url

> アプリのプレビュー ページ (デフォルトで有効) は、ユーザーがアプリで Dynamic Links を開いたときに、最も適切なリンク先に確実に移動できるようにします。ただし、このページがなくてもダイナミック リンクを確実に開くことができるアプリでのみダイナミック リンクが開かれることが予想される場合は、このパラメーターを使用して無効にすることができます。このパラメーターは、iOS でのみダイナミック リンクの動作に影響します。

プレビューページをスキップすると、アプリ起動までのステップをAndroidと同様にでき非常にスムーズになります。またクリップボードにURLがコピーされることもなくなるので、アプリ起動時にアラートが出ることもなくなり、かえって安心です。