REST APIを使用したFirebase DynamicLinks の作成 

FirebaseのコンソールでDynamicLinksを作成する記事はたくさんあるが、APIを使用してDynamicLinksを作成する記事があまりないような気がした。これからDynamicLinksをAPIを使用して作成する人の参考になったら良いなと思う。たくさんの記事があるので「DynamicLinksとは」などという基本情報は割愛する。

### 使用言語
PHP

### こんな想定
iOSやAndroidのアプリを使用したサービスで、クリックしたらアプリの具体的なページに飛ぶリンクを作りたい。
例えば、シューズの広告のQRコードを読み取れば、アプリ内のシューズの購入ページに飛ぶリンクが欲しい。アプリを持っていない人は、AppleストアやGoogle Playストアに飛ばされ、インストールが終わるとアプリのシューズの購入ページに飛ぶことができるリンクを作りたい。など。

### ドキュメント
今回は、DynamicLinksのショートリンクを作成する。
まずは、ドキュメントを読む前にコンソールで実際にDynamicLinksを使用して、DynamicLinksの動きや設定イメージを掴むべきである。

-------------------
イメージを掴んだところでドキュメントは以下の二つを使用する。

https://firebase.google.com/docs/dynamic-links/rest?hl=ja

https://firebase.google.com/docs/reference/dynamic-links/link-shortener?hl=ja

### コード例
以下AndroidとiOSどちらもアプリがある場合を想定する。
どちらかのみの場合は、パラーメーターを減らすと良い。
`https://google.com`に飛ぶダイナミックリンクを作成する。

#### 必要な情報
① DynamicLinksのURL接頭辞
② FirebaseのWEB APIキー
③ Androidのパッケージ名
④ iOS BundleId
⑤ iOS AppleStoreId

#### その情報はどこにあるの？
① DynamicLinksのURL接頭辞
![coetto-stg_-_Dynamic_Links_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/cc903d32-fbea-e625-8b78-153c430aa7a3.png)

Firebaseのプロジェクトの設定を確認
![coetto-stg_-_概要_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/5590b9b8-6e6e-6678-7d7b-6f5506b58be3.png)

② FirebaseのWEB APIキー　
③ Androidのパッケージ名
![coetto-stg_-_プロジェクトの設定_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/81a71b26-e0aa-5d54-afc0-de80519a5912.png)

④ iOS BundleId
⑤ iOS AppleStoreId
![coetto-stg_-_プロジェクトの設定_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/e535cdae-8508-c5de-ba71-d4f58d3d9675.png)

これらは、`.env`ファイルに記述する。以下は`.env`ファイルに記述した環境変数を`configファイル`を通して使用している。
#### DynamicLinksClientのクラスを作成

```php
<?php

namespace App\Model\Firebase\DynamicLinks;

use GuzzleHttp\Client;
use Psr\Http\Message\ResponseInterface;

class DynamicLinksClient
{
    private string $endpoint;
    private string $domainUriPrefix;
    private string $androidPackageName;
    private string $iosBundleId;
    private string $iosAppStoreId;

    public function __construct()
    {
        $this->endpoint = 'https://firebasedynamiclinks.googleapis.com/v1/shortLinks?key='.config('services.firebase.api_key');
        $this->domainUriPrefix = config('services.firebase.domain_uri_prefix');
        $this->androidPackageName = config('services.firebase.android_package_name');
        $this->iosBundleId = config('services.firebase.ios_bundle_id');
        $this->iosAppStoreId = config('services.firebase.ios_app_store_id');
    }

    public function getShortLink(string $urlParameter): ResponseInterface
    {
        $httpClient = new Client();

        return $httpClient->request('POST', $this->endpoint, $this->params($urlParameter));
    }

    private function params(string $urlParameter): array
    {
        return [
            'json' => [
                'dynamicLinkInfo' => [
                    'domainUriPrefix' => $this->domainUriPrefix,
                    'link' => $urlParameter,
                    'androidInfo' => [
                        'androidPackageName' => $this->androidPackageName,
                    ],
                    'iosInfo' => [
                        'iosBundleId' => $this->iosBundleId,
                        'iosAppStoreId' => $this->iosAppStoreId,
                    ],
                    'navigationInfo' => [
                        'enableForcedRedirect' => true, //オプション
                    ],
                ],
                'suffix' => [
                    'option' => 'SHORT',　 //4文字のショートリンクになる
                ],
            ],
        ];
    }
}
```

上記のオプションのパラメーターを入れることで、下の画像のような画面をとばしてアプリに直接遷移させることができる。
![「アプリで開く」を実現する、Firebase_Dynamic_Linksの実装と運用Tips_-_ログミーTech.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422935/259b2db8-d9f4-8ac8-6951-105a206397c8.png)

#### DynamicLinksClientのクラスを使用してショートリンクを作成する

```php
$dynamicLinksClient = new DynamicLinksClient();
$response = $dynamicLinksClient->getShortLink('https://google.com');
$decodedResponse = json_decode($response->getBody()->getContents(), true);
$decodedResponse['shortLink'];  //→https://example.page.link/WXYZ
```

ダイナミックリンクは`https://example.page.link/WXYZ`でこれをクリックすると`https://google.com`が開く。

全てドキュメントに書いてあるが、私みたいな初心者はそのドキュメントを解読するのに時間がかかった。
慣れるとドキュメントを読みながら実装を進めることができるが、この記事がDynamicLinksの実装イメージを持ちたい人の助けになれば嬉しい。