Universal Links 実装のニッチな落とし穴

こんにちは。モバイル開発チームに所属している小島です。

現在kintoneというクラウドサービスのUS向けiOSアプリを開発しています。 kintoneは、お客様ごとにサブドメインで区切られています。 そういった特徴のあるkintoneのクライアントアプリでUniversal Linksを実現しようとした時に、ハマったこと、またその解決方法を紹介します。

Universal Links とは

iOS 9から導入された機能で、URLを開いた時にwebページではなくアプリを立ち上げることができるようなります。

実装方法

公式のドキュメントは以下です。

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

細かい実装方法については、検索すればたくさんの日本語の解説があるのでそちらをご参照ください。 かいつまんで書くと

  • (サーバー側) 紐付けたいURLのドメインのルートに apple-app-site-association ファイルを置く
  • (サーバー側) apple-app-site-association に、紐付けるアプリの情報と、パスを記載する
  • (アプリ側) プロジェクトの Capabilities > Associated Domains のところに紐付けるドメインを設定する

これでOKのはずです。公式のドキュメントには、ワイルドカードとして*が使用できるとのことだったので、アプリの Associated Domains には以下の設定をし、各ドメインのルートに apple-app-site-association を配置しました。

applinks:*.cybozu.com

これではダメでした😢

結果的には、これではうまくできませんでした。
何回URLを入力してもアプリは立ち上がってきません。

解決に向けて🤔

さてどうしたもんかと、まずは Stack Overflow を検索したりもしましたが、有効な情報は得られませんでした。
そもそも接続先のドメインがユーザーによって異なるようなサービスが少ないためでしょうか。

とりあえず、どのタイミングで apple-app-site-association を端末が見に行っているのか気になって、通信内容を確認したところ光明が見えてきました。

apple-app-site-association ファイルは、インストール時(またはアップデート時)にアクセスしていました。
以下のキャプチャはその時のものです。

f:id:cybozuinsideout:20180302170616p:plain

このキャプチャからわかるように、
https://cybozu.com/apple-app-site-association
へアクセスしています。

※ この記事のためにキャプチャを取り直しているので、今は 200 OK が返ってきていますが、調べた当時はエラーでした。

よくよく考えてみれば、各ドメインごとに apple-app-site-association を見に行くよりは、この方が合理的ですね😎

結論

*.cybozu.com に対して Universal Links を設定する場合は、cybozu.com に apple-app-site-association を配置する。

(hoge.cybozu.com, huga.cybozu.com に配置してもうまく行きません)

ニッチな情報ではありますが、どなたかの参考になれば幸いです。