iOS Universal Links対応のTipsとハマりどころ

ユニバーサルリンクをQiitaのいくつかの記事も参考になったのでそのまとめと、他のプロダクトへの対応もあるので備忘録的Tipsにまとめました。


# ■Universal Links とは
Universal Links とは、Webサイトのリンクをクリックした時にiOSのアプリを起動させるAppleの手法です。（iOSバージョン9以上で利用可能）。
また、URLスキームによる起動と異なり、「アプリを開きますか？」のポップアップは表示されない。


適用されるとページを開いた場合、少し下にスクロールすると下図のようなボタンが表示され、これをタップすると、アプリが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252082/89d122f3-f769-3854-2b44-d1b5f3faefa7.png)


# ■Universal Links の仕組み
Associated Domainsで設定したドメインのapple-app-site-associationファイルが、アプリの初回起動時にApple CDN※ からダウンロードされ、ファイルに記載のあるパスのみ、タップ時にアプリに遷移するようになるというものです。

※iOS14未満は、アプリがインストール時に、associated domains に登録されているドメインのサーバからapple-app-site-association を直接取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252082/e8d6a2fb-ee23-9619-1fc5-ba46c6c910a1.png)

# ■Universal Linksの発動条件
- ユニバーサルリンクが起動する/しないの条件についてはこちらの記事が参考になりました。

https://qiita.com/poteko_knnn/items/fce0061b081160668217


---
# ■実装作業 イメージ
- 実装する作業は、大きく３つとなります。

1. 関連づけファイル [apple-app-site-association](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html"apple-app-site-association")をサーバに配置
1. [Associated Domains](https://developer.apple.com/documentation/Xcode/supporting-associated-domains"Supporting Associated Domains")の追加
1. アプリ起動時のハンドリング

詳しくはAppleの [Allowing Apps and Websites to Link to Your Content](https://developer.apple.com/documentation/xcode/allowing-apps-and-websites-to-link-to-your-content?preferredLanguage=occ"Allowing Apps and Websites to Link to Your Content") ドキュメントにまとめられています
Qiitaでは、こちらの記事が参考になりました。

https://qiita.com/fnm0131/items/8a64bac0753234babf1d

https://qiita.com/KenNagami/items/c2d4c2bdb89576b4c052



---
# ■Tips集
## 【1】開発環境のサーバのIP制限
###【課題】開発環境では、外部に公開しないためにIP制限をしている為、Universal Links が機能しない
- 外部公開しないため、IP制限CDNが webサーバ・アプリからも apple-app-site-association を取得することができなくなり、Universal Links が機能しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252082/f24f52d7-dde4-5454-70fc-db2bc7caeb0e.png)


###【対策案】
- 解決するためには、リクエスト元のApple のIP がわからないので、**全てのIPを許可**してください。ただし、クローリングされないよう検証期間を決めてIP制限の解除をしてください。

---
## 【2】Universal Links の発動条件関連
念のため以下Appleの情報を確認してください。

https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html

###【課題①】apple-app-site-association を更新しても、すでにインストール済みのユーザはユニバーサルリンクは発動しない。
- 新規インストール時・アプリアップデート時のみapple-app-site-associationのファイルをダウンロードするため、apple-app-site-association だけを更新したい場合は、企画側とも事前にすり合わせが必要となる。

###【対策案】

- インストール済みのユーザーにすぐに変更を届けたい場合でも、OSの仕様上新規インストール時・アプリアップデート時にしかファイルが更新されないため、アプリの空リリースを計画しましょう。

------
###【課題②】apple-app-site-associationファイルをサーバに配置しても、すぐにUniversal Linkは発動しない

###【対策案】
- 反映されるまで待つしかないのですが、リリース版とTestFlight版でそれおれ反映される時間は異なるようですが
私が本番リリースしたときは、約1時間ほどかかりました。
こちらの記事が参考になりました。

https://qiita.com/orimomo/items/f7b2acd12bf8d26d48fe


------


###【課題③】同一ドメイン上では、アプリへ遷移ができない。※

:::note alert
※「同一ドメイン上ではアプリへ遷移しない」動作は、Androidではアプリへの遷移が可能となります。
　　iOS・Androidの挙動に注視して両OSのユニバーサルリンク及びAppLinks対応を判断してください。
:::

###【対策案】
- iOSとAndroidで挙動が異なるため企画側とも認識合わせをしておく。
- 見た目が同じのサブドメインを用意し、ユニバーサルリンクをサブドメインとするようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252082/8b482f39-101a-2964-abb3-f2a7c6d8d655.png)


------
###【課題④】ユニバーサルリンクを、短縮URLやリダイレクトするようにしてしまうと、機能しなくなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252082/c40bddc3-d5fe-33e3-703c-5a96e18a3fb8.png)


:::note info
※  Androidは、アプリへの遷移が可能となります。
　　iOS・Androidの挙動に注視して両OSのユニバーサルリンク及びAppLinks対応を判断してください。
:::

###【対策案】
- 短縮URLは使用しない
- アプリ側にも短縮URLの解析処理が必要となりますが、短縮URLにユニバーサルリンクを発動させるように設定する。

 　
------
## 【3】計測系に有益な情報

###【課題①】起動がユニバーサルリンクかどうか判断したい

- トラッキングとして、ディープリンクのスキーマ起動と分けて計測したい

###【対策案】
application(_:didFinishLaunchingWithOptions:)の中でユニバーサルリンク判断ができるとのことです。
こちらの記事が参考になりました。

https://qiita.com/sushi__melody/items/ce46fb45e1280414cc78

------
###【課題②】Universul Linksが遷移元がわからない。
- 例えばGoogle検索結果のリンクから遷移したかなど知りたい。

###【対策案】
- iOS11から、アプリで遷移元を取得できるようになった。

こちらの記事が参考になりました。
https://qiita.com/keroppi0_0/items/4dbe542aba966dcc548f


## 【4】apple-app-site-associationの遷移対象パス作り方について
- <code>NOT</code>指定など発動させたくないURLなどでUniversal Linksの発動させる/発動させたくないURLの制御が可能です。細かくわけたいときは、工夫が必要です。




- iOS12以下も発動させたい場合の遷移対象パス作り方は、こちらの記事が参考になります。

https://qiita.com/keroppi0_0/items/1a7fab4a8cc78412d30c

- iOS13以降だけでよい場合の遷移対象パス作り方は、こちらの記事が参考になります。

https://qiita.com/gurensouen/items/4fc282b91dff468cf9ed