今更ながら、Universal Links開発時に少しつまづいたポイントのメモ。
Universal Linksのおさらい
Appleが提供する、いわゆるディープリンクの手法の一つです。これによりウェブサイトURLから直接アプリ内のコンテンツを開く、といったことが可能になります。あるいは、カメラからQRコードを読み取った際に表示されるリンクから、アプリに遷移することも可能です。(未インストールの場合とインストール時の場合で表示されるリンク・タップ時の挙動が異なります)
最低限必要になる実装は2つあります。
- TARGETS → Signing & Capabilities → Associated Domains を有効にし、
applinks:{domain}
の記載を追加 -
apple-app-site-association
をサーバーに配置
{
"applinks": {
"apps": [],
"details": [
{
"appID":"{TeamID}.{Bundle Identifier}",
"paths":[ "*" ]
}
]
}
}
appIDとpathsの部分が可変になるかと思います。pathsにはディープリンク起動させたいドメイン下のパスを設定します。ワイルドカードの設定も可能です。
こちらを https://{domain}/.well-known/apple-app-site-association
に配置します。(おそらくjson拡張子は不要)
これによりドメインとアプリの関連づけが行われ、Custom URL Schemeで問題となっていた、UXの低下(起動する前にダイアログが出る)・セキュリティの低下(スキームの重複を避けられない)・インストール時/未インストール時の挙動(そもそもインストールされていなければ動かない)などの面において、優位性を持つことが出来ます。
iOS14以降での開発時に必要な設定
とある案件で、とりあえずカメラからURL付きのQRコードを読み取らせてインストール済みのアプリに遷移できるか?という検証を行いました。
deployment targetはiOS14で、上記の設定を行なっていればアプリが起動してくれるはず。applicationメソッドで起動時のハンドリングを行うこともできますが、そちらは一旦実装無しとしました。
が、起動せず。アプリをインストールしているにも関わらず、タップしてもQRコードに設定したURLへブラウザ遷移するのみ。
なぜなのか。調べてみるとこれは、iOS14以降の仕様変更が起因しているみたいです。
Apple CDN
アプリはapple-app-site-association
をダウンロードする必要があります。これまでこちらをリクエストする際は、サーバに直接リクエストをしていました。このリクエスト先が、Apple CDNに移ったとのことです。
以前まではアプリに関連するドメインが複数あった場合、その分だけリクエストを行っていたのですが、Apple CDNへのリクエストではこれを1度に全て取得することが可能になったようです。そしてapple-app-site-association
に関しては、Apple CDNからリクエストするようになったとのことです。
この仕様変更によりUniversal Linksが起動しなくなる理由の一つは、サーバ側のIP制限にあるようです。Apple CDNがapple-app-site-association
を取得することが出来なくなっていたため、当然アプリにもダウンロードされることがなく起きていた、と考えられます。
対策
取れる策としては、2つあります。
- IP制限を外す
- 開発モードとして挙動するよう設定し、Apple CDNをバイパスする
1は単純なので、2について解説します。
まず、アプリ側で設定したapplinksの後ろに?mode=developer
というオプションを追加します。
次に、開発向けの署名アプリで「設定」> Developer > Associated Domains Development をONにします。
こうするとApple CDNをバイパス(省略)し、直接ドメインのapple-app-site-association
を取得しにいくようです。
というような流れで一件落着しました。
以上、遅ればせながらUniversal LinksのTipsでした。担当する案件によってすぐに当たらない時もあるので、自主的に手を動かすことは大切ですね。