AndroidのFirebase Dynamic Linksをお試し 


Android12からhttpsでのディープリンクができなくなったという記事を見たこともあり、今後はhttpsでのアプリ起動する場合、FirebaseのDyanamic LinksもしくはAppLinksが必要そうだったので調査しました。

その記事は[こちら](https://doordash.engineering/2022/01/25/your-deep-links-might-be-broken-web-intents-and-android-12/)

まずはFirebaseのDynamic Linksについて調べてみたのでまとめです。

<h2>1.Firebase Dynamic Linksとは？</h2>
Android,iOSの両方の端末でURLをクリックした際に、アプリを起動できます。その際にアプリがインストールされていない場合、GooglePlayStore、AppStoreの該当ページに遷移したり設定したページへの遷移なんかができたりします。
URLSchemeと違って、起動時に複数のアプリが存在する場合にはアプリ選択画面が出てくることなく、該当のアプリを直接起動できます。

<h2>2.Firebaseプロジェクトの設定</h2>

Dynamic Linksを利用するにはまず、Firebaseのプロジェクト作成が必要になります。

該当のアプリを選択して、プロジェクトの設定を行います。

![スクリーンショット 2022-02-27 13.43.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/4065b84b-a28d-19fb-a8a1-8d17c2b34fa8.png)


プロジェクトの全般 -> アプリ追加からAndroidのアプリを追加

![スクリーンショット 2022-02-27 13.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/7bf96faf-7bca-57f2-bccd-70ad8b0a4e63.png)


手順に従って、jsonファイルを該当のプロジェクトに配置します。
SHA-1の登録がありますが一旦スキップしてしまってOKです。

![スクリーンショット 2022-02-27 13.50.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/e3efffd2-76c0-8ea6-66b5-072736201e55.png)

プロジェクトにgoogle-services.jsonを設置
![スクリーンショット 2022-02-27 13.52.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/b2221f14-2d79-7e06-e1ab-572b1ca1b26f.png)


アプリで署名して使うkeystoreのSha1とSha256の情報をプロジェクトに追加します。

下記のコマンドで取得できます。

```
keytool -list -v -keystore [keystoreのパス]
```

![スクリーンショット 2022-02-27 14.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/84eef6fa-bb75-f0c8-4c76-5def88a1ce63.png)



取得したSha1とSha256を登録します。(画像の赤枠部分です)


Firebaseの設定は完了です。あとはDynamic Links側の設定をします。

<h2>3.Dynamic Linksの設定</h2>
独自のURLを発行し、アプリがなかった時などの設定を行います。

FirebaseのメニューのDynamic Linksを選択します。
![スクリーンショット 2022-02-27 14.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/8f0ef718-2b23-16a9-990b-a9e643a130fb.png)


ドメインを作成します。こちらは利用されていないものにする必要があるので、xxxx.page.linkのxxxxの部分を独自の文字列にすればOKです。

![スクリーンショット 2022-03-22 15.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/6b747f17-8d30-ff90-3232-8a6faa86e6f1.png)


ドメインに問題がなければ下記のように作成されます。

![スクリーンショット 2022-02-27 14.01.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/1b865195-63cd-27a0-d030-8e1759df16a8.png)


そのあと、「新しいダイナミック リンク」からURLを作成します。

![スクリーンショット 2022-02-27 14.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/5e53350d-255f-db34-7655-ea437aba3e34.png)


押下すると下記の画面が表示されるので、各々設定していきます。

![スクリーンショット 2022-02-27 14.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/dc31ce63-c89e-f636-2e04-e9666e3d72a6.png)

ダイナミック リンクの設定です。今回はテストで入れているのですが、実際はアプリの紹介ページなどになります。
アプリがインストールされていない場合(設定による)やPCで該当のURLを開いた場合にはこちらが開くようになります。

![スクリーンショット 2022-03-15 15.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/e3cb8540-b11e-9662-1b5c-0e85a3b28019.png)


Android用のリンク動作を定義できて、アプリ内でディープリンクをハンドリングするかやインストールされていなかった場合にGooglePlayのページを開くなどの設定が可能です。
「dynamictest」となっていますが、こちらは今回実際にアプリを起動させる対象になるので最初の流れで作成したFirebaseプロジェクトの値を設定しておきます。

![スクリーンショット 2022-02-27 14.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/df6d91bd-e818-728c-dbbe-5a7d8eda0fe0.png)


ここまで設定できたら、Dynamic Links側の設定も完了です。

<h2>4.アプリ側の設定</h3>

アプリ側の設定についてですが、AndroidStudioを使っていると比較的簡単に設定してくれます。

AndroidStudioのTools -> App Links Assistantを選択

![スクリーンショット 2022-02-27 14.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/530c7d1d-7831-39b1-5829-d2e26b199ea8.png)


メニューが表示されるので、「Open URL Mapping Editor」を押下します。
![スクリーンショット 2022-02-27 14.28.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/bf99a062-e54a-d588-d492-14297de5b8e9.png)



Hostに先ほど作成した、URLを入れます。Activityには起動したいActivityを入れておきます。

![スクリーンショット 2022-02-27 14.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/20ca6a38-08ac-f6c4-514b-582b89c0a620.png)

こちらでOKを押すと、AndroidManifest.xmlに追加されます。

Webサイトに設置されているものと一致しているかの確認ができるのですが、こちらdebugだとうまくいきますが選択したkeystoreだとうまくいきませんでした。。。
そのため、別途下記のサイトでチェックしました。
https://developers.google.com/digital-asset-links/tools/generator


各項目を入れて「Test statement」を実施して、Successになれば大丈夫です。
![スクリーンショット 2022-02-27 14.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/27be57c6-6a6a-7406-b99b-966375526716.png)

下記の「Generate Digital Asset Links file」とありますが、今回はFirebaseのDynamic Links側で自動で生成してくれるので不要なため、そのまま閉じてしまってOKです。

![スクリーンショット 2022-02-27 14.36.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/d40c5949-a2f5-b23f-0bdc-59c904a62b54.png)


これで全て準備が終わったので、端末にアプリを入れて起動してみます。
<img width="200" alt="テスト1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/5cbef7f3-49d6-3363-662e-72824678940e.png">

<img width="200" alt="テスト2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/05a2598a-6af7-b5c3-881c-365458690413.png">

<img width="200" alt="テスト3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/096cbb90-c67b-b558-d890-3cbb455e52b7.png">

ブラウザでURLを入力すると、一瞬プログレスダイアログが表示された後でアプリが起動します。

<h2>アプリ側でハンドリングしたい場合</h2>
アプリの起動までは出来たのですが、案件によってはURLによって起動する画面を選びたいみたいなことが発生すると思います。
その場合にはアプリ側で処理をハンドリングできるようにアプリ側に設定が必要です。
公式ページが分かりやすく記載あるので、下記を参考にするといいと思います。

[公式ページ](https://firebase.google.com/docs/dynamic-links/android/receive) 

まずはFirebaseの設定を有効にするために、アプリのprojectのgradleにpathを追加

![スクリーンショット 2022-02-27 15.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/e4675d2b-503b-bfef-ff35-4dd14066d49f.png)


アプリのモジュール側のgradleのpluginsに追加
![スクリーンショット 2022-02-27 15.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/b162b0bc-1375-3e6d-e5f8-6b5999628adc.png)


同様にアプリのモジュール側のgradleにDynamic Linksで利用するライブラリ追加
![スクリーンショット 2022-02-27 15.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/2a5ceb6b-b16f-c6f6-d3c5-8f34ac83a25a.png)


firebase-bomというのを使うとFirebase関連のライブラリの関係を解決してくれるようなので、一つ一つ設定する必要がなくて良きです。
利用しない場合は、bomを外して各々のfirebase-dynamic-linksとfirebase-analyticsにバージョン指定すればOKです。


起動する先に指定したActivityでDynamic Linksのデータを受け取れるように記述します。

``` kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        getDynamicLinks(intent)
    }

    private fun getDynamicLinks(intent: android.content.Intent) {
        FirebaseDynamicLinks.getInstance()
            .getDynamicLink(intent)
            .addOnSuccessListener(this) { pendingDynamicData ->
                if (pendingDynamicData != null) {
                    Toast.makeText(
                        applicationContext,
                        " dynamic links url ${pendingDynamicData.link}",
                        Toast.LENGTH_LONG
                    ).show()
                }
            }
    }
}
```

これでURLが取得できるようになりました。テストでToastを表示するようにしてます。

<img width="200" alt="テスト4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1893524/e27300b8-4989-43e5-eddc-020122df70cc.png">

Dynamic Linksの設定されているディープリンクのURLが取得できます。
こちらのURLにクエリをつけるなどすればそちらをパースすることでアプリ側で出し分けなどは可能です。

<h2>5.まとめ</h2>
Firebase Dynamic Linksについて調べてみました。導入から実行まで比較的簡単に試せるのが分かっていただけたのでは？と思います。
AppLinksと比べるとホストの設定等の手間がなく、気楽にURLでの起動が試せるのが良かったです。

「インストールされていなかったら、ストアに飛ばしたい」や「あるWebページに飛ばしたい」となるとWebページ側で対応が必要だったりしますし、セキュアな情報をやりとりしようとした際にはURLSchemeだと別のアプリでも起動できる可能性があったりと安全ではない部分があります。
Firebase Dynamic Linksを利用すれば、そういったところが簡単に実装できるので広告で利用したり、LPページにダウンロードリンクを付けたりするときに便利ですし、外部の決済サービスとの連携を行ったりする場合にも利用できるのではないかと思います。