Firebaseを活用してUniversal Linksで他人にデータを渡す

## 活用した状況
[checka!](https://itunes.apple.com/jp/app/id1451433619)というiOSアプリを開発しています。このアプリはTrelloのような、グループで使えるチェックリスト管理アプリです。このなかで、自分のグループに知人を招待するためにはID文字列を渡す必要がありました。その際にUniversal Linksを使えば簡単に実現できることはわかっていたのですが、

- バックエンドを用意したくない
- ドメインもめんどくさいからとりたくない
- FirebaseHostingやAmazonS3のドメインそのままの感じは嫌だ

という感じでした。そのときに[Firebase Dynamic Links](https://firebase.google.com/docs/dynamic-links/?hl=ja)を使えば簡単に、しかもドメインもそれなりのもので実現することができた話です。

## TL;DR
- Dynamic Linksのドメインは `*.page.link` なのでそれなりのドメインにできる
- アプリがインストールされている場合はアプリが開かれ、インストールされていない場合のリダイレクト先を設定できる
- バックエンドいらずでお手軽Universal Linksができる

## 事前準備
### Firebase側
Firebaseのセットアップを行ってください。下記が公式リファレンスなのでこれに従ってやれば詰まることはないかと思います。

[https://firebase.google.com/docs/guides/?hl=ja](https://firebase.google.com/docs/guides/?hl=ja)

### iOS側
Associated Domainsの設定が必要です。2つやることがあります。

#### 1. AppIDにAssociated Domainsの設定をする

Apple Developerのサイトに行って、対象のApp IDを開いて下記のようにAssociated DomainsをEnabledにしてください。

<img width="541" alt="スクリーンショット 2019-02-11 16.50.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/45a58227-77a0-5341-9eb7-d487498d592b.png">

#### 2. XcodeからCapabilitiesでAssociatedDomainsの設定をする

この部分で、AssociatedDomainsをONにしておいてください。Dynamic Linksの設定が終わったら追加で記入します。

<img width="1216" alt="スクリーンショット 2019-02-11 16.54.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/be083a3a-ecc7-6efd-5d53-425a33ad72af.png">


## Dynamic Linksの設定
### 利用開始
Firebaseのコンソールを開き、対象のプロジェクトを選択して、左側のメニューから「Dynamic Links」を開いてください。この画面はころころ変わりそうな気もするのであれですが、下の画像のような内容が出てると思うので、「始める」を押してください。

<img width="727" alt="スクリーンショット 2019-02-11 16.58.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/345f696f-df21-8fdc-3736-e4cd4ce07e07.png">

### サブドメインの設定

サブドメインの設定を求められるのでいい感じのサブドメインを決めましょう。[checka!](https://itunes.apple.com/jp/app/id1451433619)の場合は、 `checka.page.link` です。そのままですね。この部分は早いものがちだと思うので、取られていたら仕方ないという感じですね。

<img width="673" alt="スクリーンショット 2019-02-11 17.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/b5b62937-1aa6-fc17-553f-241c4d24f771.png">

### Dynamic Linkの作成

#### 新規作成

こんな感じの画面になっていると思うので、「新しいダイナミックリンク」を押してください。

<img width="951" alt="スクリーンショット 2019-02-11 17.04.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/723e8957-17ac-e045-5a43-149d2200919d.png">

#### パスの設定

Dynamic Linksは短縮URLの作成ができるので、今回の用途的には少し違和感があるかもしれません。URL接頭辞として、すきな文字列を入力しましょう。[checka!](https://itunes.apple.com/jp/app/id1451433619)のグループ参加の場合は `/join_group` しました。ちなみに、2019/02/11現在ではパスを切ることはできませんので、`/group/join` にはできませんでした、残念。

<img width="672" alt="スクリーンショット 2019-02-11 17.12.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/9ec4d736-133b-dee9-44a7-7e185c3f476d.png">

#### ディープリンクの設定

今回は使わないので、ディープリンクURLはAppStoreのURLを入れて、リンク名もアプリ名を入れておきましょう。

<img width="650" alt="スクリーンショット 2019-02-11 17.14.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/9cc9642f-3756-ab73-9b70-7d7dafc09032.png">

#### iOS用の設定

下の「ディープリンクをiOSアプリで開く」にチェックを付けて、セレクトボックスから対象のアプリを開きましょう。ここで選択されたアプリのbundleIDが、端末にインストールされているアプリのbunldeIDと異なっていると、Universal Linksによるアプリ起動ができないのでご注意ください。また、AppStoreIDやTeamIDの入力が必要になります。AppStoreIDは、checka!だと`https://itunes.apple.com/jp/app/id1451433619` の数字の部分、TeamIDはAppleDevelopterのAppIDのPrefixの部分です。

<img width="502" alt="スクリーンショット 2019-02-11 17.16.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/a59fca22-cd5f-e131-b67b-433a67d559be.png">

選択すると、下記のような項目がでてきます。ここでは、アプリがインストールされていない場合の挙動を設定できます。自分は上の「アプリのAppStoreページ」を選択しましたが、必要であればカスタムURLの設定を行うことができるようです。

<img width="573" alt="スクリーンショット 2019-02-11 17.20.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/7ae97a31-005f-417e-c03d-8cee2131706e.png">

#### Android用の設定

Androidでも利用する場合は設定を行う必要があります。今回は割愛します。

#### 詳細オプション

[checka!](https://itunes.apple.com/jp/app/id1451433619) では、一番下のチェックボックスにはチェックを入れています。ここのチェックを入れていない場合、インストールされていない端末で開くと、Firebase側の画面に一度アクセスして、そこにボタンがあり、そのボタンを押すとAppStoreへアクセスすることになってしまい、自分としては微妙でした。よって、チェックをいれています。

<img width="660" alt="スクリーンショット 2019-02-11 17.26.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/513f216c-f97d-0a41-6e82-01a150165914.png">

#### 完了

ここまででDynamic Linksの設定は完了です。ここまでやれば、`https://[your subdomain].page.link/apple-app-site-association` にアクセスすると、Universal Linksに必要な設定項目がJSONとして返却されているかと思います。

## アプリの設定

### Associated DomainsのAppLinks設定

先程のXcodeのCapabilitiesの設定を開き、Associated Domainsの項目の＋を押して、`applinks:[your subdomain].page.link`を追加しましょう。これがないとアプリで起動できません。

### 試す

Dynamic Linksで設定した項目に応じたURL `https://[your subdomain].page.link/[your path]` に、今までの設定がされたアプリをインストールした端末でアクセスしてみましょう。アプリが起動するはずです。

### ハンドリング

Dynamic LinksのページにはSDKを使ってハンドリングしていますが、今回は不要です。 `AppDelegate.swift` で下記のような感じでハンドリングできます。

```swift
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let incomingURL = userActivity.webpageURL else {
                return false
        }

        // incomingURLをゴニョゴニョする

        return true
    }
```

## checka!では

`https://checka.page.link/join_group?id=[id]` でアクセスされた場合、パラメータに渡されたidを入力した状態でグループ参加の画面を開いくようにしています。ちなみに、この機能は2019/02/11審査に出したので、執筆時点ではまだリリースされていません。

## おわりに

自分としてはとても楽をして、ユーザー体験を高めることができたのでとてもありがたかったです。よければTwitterフォローしてください。

Twitter: [@_mogaming](https://twitter.com/_mogaming?lang=ja)