【Unity】必要最低限でアプリ宣伝用のストアリンクをiOS,Androidとで1つにした話


# 前置き
- 今まではtwitterで宣伝用URLをこんな感じで、OS別にリンクを貼っていた
<img width="６00" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/75c72411-647c-6c5d-396d-b440ebfb965c.png"><br>
- 文字数もスペースも取るし、1つのリンクでそれぞれOS別に挙動が変わると嬉しいかも（以下のようなイメージ）
<img width="６00" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/81fb60e4-bce5-9aa1-cfc7-061858c721a9.png"><br>
    - Android<br><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/b13b343a-3451-9a96-6144-034387680956.gif">　<br>
    - iOS<br><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/63d1f161-f184-0260-3882-8592d6185287.gif">
- ついでにインストール済ならアプリを起動して欲しい！（以下のようなイメージ）
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/7f03ff91-4a1f-74d2-e0b7-4b006ea828d4.gif"><br>
- そんな時、`Firebase Dynamic Links`という**無料で使える**神サービスがあったので、それを使って、上記のような振る舞いをUnityで実装するやり方を本記事では紹介させていただいてます

# 最終結果
- 以下のようにURLが生成されます！ OS別に挙動が変わるので、是非体験してみてください！
    - [https://yasuragie2.page.link/E2wc](https://yasuragie2.page.link/E2wc)

# 対応手順
## 前提
- Dynamic Linkからパラメータを受け取って、アプリ側で何かするということはしない
（DeepLinkは活用しない）

## 全体の流れ
1. FirebaseでDynamic Linkの設定を定義する

## Firebaseでプロジェクトを作成（作成済ならスルー）
1. consoleへ移動
    1. https://console.firebase.google.com/u/0/?hl=ja
1. プロジェクトを追加
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/9546b4c4-cb98-b55c-ad07-ef687e573dc2.png"><br>
    1. プロジェクト名：`アプリ名`
    1. Google アナリティクス：`無効`（Dynamic Linkだけ使いたい場合）
    1. 作成！


## アプリ追加（追加済なら、8の追加設定だけ確認）
1. サイドメニューからプロジェクトの概要をクリック
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/de228c1e-e2e3-fd03-606b-1d50a7673fa0.png"><br>
2. `+アプリを追加`から追加
<img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/8590ad69-205e-33dc-cea0-178e30ff1241.png"><br>
3. Unity選ぶと、iOS/Android一気に追加できるので、Unity選択
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/ae7dda84-7215-0ac7-3aa5-c06eb589e1ee.png"><br>
4. いずれも登録する感じで設定
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/c832a6fd-de81-da66-6162-30565598decd.png"><br>
5. 設定ファイルは、本記事の利用範囲内なら、ダウンロードはスルーでOK
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/4e2cf25e-2b2b-c01b-9f89-0455bfbe86e1.png"><br>
6. SDKも、本記事の利用範囲内なら、ダウンロードはスルーでOK

7. 無事登録完了
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/534ae9e7-f98d-3385-9a60-59c77f56c2fc.png"><br>
8. 各アプリの設定から、追加で設定
    1. iOSでApp Store IDと、チームIDを設定
    <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/7871a064-e35b-676b-15a1-bcaf1b2007e8.png"><br>
        - Asstore ID： [Apple Store Connect](https://appstoreconnect.apple.com/apps)から確認可能
        - チームID： [Apple Developerサイト](https://developer.apple.com/account)から確認可能
    2. Android側は特になし
    

## Dynamic Links

### Firebaseセットアップ
1. サイドメニューのエンゲージから`Dynamic Links`を選択
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/dfb1f92e-4d46-c59e-92a8-52071f88eb07.png"><br>
2. 始める
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/6423d32c-5ff9-3010-d78f-218aecd19e19.png"><br>
3. ドメインは無料の範囲でよければ、`xxxxx.page.link`で、URL接頭辞の追加→終了
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/7d7a4a3d-91b0-7720-cfc5-0d739fca3929.png"><br>
4. `新しいダイナミック リンク`から追加
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/24e9c2af-1832-a1c5-76e1-944fc4dd12c8.png"><br>
5. 短縮URLのリンク設定はそのままでも好きに変えても（任意）
6. ダイナミック リンクの設定はPCで開かれた場合のURLを入力（内容は任意）
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/9ebe1dc7-aee9-02f0-3c59-7b9923d7b7ec.png"><br>
    - ※ 例として、スクショではホームページのリンクを設定
    - ※ ただし、このやり方はアプリにDeepLinkが渡されて何かするということをしない前提でのお手軽な設定の仕方となってます。もしDeepLinkも活用しつつ、iOS/Android以外のプラットフォームにも対応するのであれば、[ダイナミック リンク URL を手動で構築する](https://firebase.google.com/docs/dynamic-links/create-manually?hl=ja)方法もあり、`ofl`のパラメータを利用するような形にすると、ちゃんと対応できそうです
7. リンク動作の定義は、インストールされていればアプリ開いて、未インストールならストアページ表示する感じに設定
    - iOS  
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/dc628b68-daed-744d-d630-5610ada8fcb8.png">

    - Android  
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/89641304-e698-1215-0a7b-f9420efbcf0f.png">

8. キャンペーン トラッキング、ソーシャルタグ、詳細オプションはスルーしてもOKだが、**iOSで**preview画面をスキップしたい場合は、`アプリのプレビュー ページをスキップする（推奨されません）`にチェックする
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/349f7a0d-5f58-cabd-f448-242aa8442f31.png">
    - preview ページというのは動かしてみるとわかりますが、iOSでのみm以下のようにストア画面 or アプリ画面の前に表示される画面です。ただ、`スキップする`にすると、インストール時に直接アプリに遷移せず、ストア画面に飛ぶようになります（以前は飛んだが、どこかのタイミングで仕様が変わったみたい）
        <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/f958c58a-a7d4-22d4-0a04-8d48dd1e94cd.jpeg">


9. 許可するドメインを設定
    1. 警告が出てるので、そこから設定
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/561fcc25-d0d0-c23d-5784-ffd4a24263bd.png"><br>
    2. 以下をとりあえず設定
        - 3で指定したドメイン：`xxxxx.page.link`
            - これはリダイレクトする際に通ってるみたいで、指定しておかないとエラーになってしまう
        - Apple Storeのドメイン：`apps.apple.com`
        - Play Storeのドメイン：`play.google.com`
        - 6で指定したドメイン：`xxxxxxxxxx`
        <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/2b5cd074-e40c-61c8-ee78-8946b2593075.png"><br>
    3. もしアプリのIDを指定したいとか、6で指定したドメインに`/`含む場合は、正規表現で追加登録ができるので、そちらから登録<br><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/055c013b-2436-6bed-23c4-a294b48da1aa.png">
        - 正規表現の参考値
            - ^https{0,1}:\/\/apps\.apple\.com([\/#\?].*){0,1}$
            - ^https{0,1}:\/\/play\.google\.com([\/#\?].*){0,1}$





### Unity側のセットアップ
- 本記事の利用の範囲ないであれば、未セットアップでOK
    - もし、Dynamic Linkのパラメータ等をアプリ側で受け取って、そこの先で処理したいことがあるのであれば、セットアップは必要そうだが、宣伝用にストアへの促し、アプリの起動の分岐だけであれば、Firebase側の設定だけで事足りる
    - そのため、SDKもimportしなくてOK

### Xcode側の設定
- Unity側は特に不要でしたが、iOSの対応として、Xcodeの追加設定だけ必要
- Unity-iPhoneのProjectで`Signing & Capabilities` > `Associated Domains`に`applinks:xxxxx.page.link`(※)を追加
    <img width="700" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/9b994a51-e555-256b-9c05-7695f969f9e9.png">
    - ※Firebaseセットアップの3で追加したドメイン
- 設定後にビルドとかすると、Apple Developer側のIdentifiersのCapabilitiesの方は勝手に更新してくれてそう
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/1314b6e5-ad37-4404-f8d1-3d3ab74aa4e0.png">


#### PostProcessBuildで書く場合
- ビルドごとに毎回Xcodeを操作するのはイケテないので、自動化するなら以下のような感じで書けました

```cs:PostProcessBuild.cs
using UnityEditor;
using UnityEditor.Callbacks;

#if UNITY_IOS
using UnityEditor.iOS.Xcode;

namespace yt.E2.Editor
{
    public static class PostProcessBuild
    {
        private const string cDomain = "xxxxx.page.link";  // ★ここは設定した独自のドメインにする

        [PostProcessBuild]
        public static void OnPostProcessBuild(BuildTarget target, string path)
        {
            AddAssociatedDomains(path);
        }

        private static void AddAssociatedDomains(string path)
        {
            var pbxPath = PBXProject.GetPBXProjectPath(path);
            var pbx = new PBXProject();
            pbx.ReadFromFile(pbxPath);
            var entitlements = new ProjectCapabilityManager(
                pbxPath,
                "Entitlements.entitlements",
                targetGuid: pbx.GetUnityMainTargetGuid());
            entitlements.AddAssociatedDomains(new string[] { "applinks:" + cDomain });
            entitlements.WriteToFile();
        }
    }
}
#endif
```

# 結果
- 生成されたURL
    - [https://yasuragie2.page.link/E2wc](https://yasuragie2.page.link/E2wc)
- Androidで未インストールの場合<br><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/b13b343a-3451-9a96-6144-034387680956.gif">　<br>

- iOSで未インストールの場合<br><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/63d1f161-f184-0260-3882-8592d6185287.gif">　<br>

- iOSでインストール済の場合<br><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/0b502925-9415-0f09-8bf2-98a517461b76.gif">

- PCの場合<br><img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87713/e1afd78d-6ad1-c16f-8fa7-22690abb2837.gif">

# 感想
- Dynamic Links便利！
- 無料でここまでやらせてくれるなんて神！
- やりたいことはできたが、短縮URLというのもあり、（前提知らなかったり）見る人によってはリンク踏むの躊躇うかも？ともちょっと思ったりもした。
分かりやすさを追求するなら、OS別にリンク貼るのも悪くないのかなとも思った
- まぁでもURL短くしたい時もあるよね！という場面もあるかと思うので、やって良かった！

# 参考
- https://firebase.google.com/docs/dynamic-links/unity/create?hl=ja