こんにちは。STORES でWebエンジニアをしていますosdです。
今回はHTTP URLを介してユーザーにネイティブアプリを起動させる仕組みについて実装をしたので、仕様を交えつつWebサーバーとして配布する項目を中心に解説します。
App Links / Universal Links とは
WebのURL エンドポイントを用いてシームレスにネイティブアプリを起動する仕組みです。
従来のディープリンクと呼ばれる技術は存在しましたが、以下の点で App Links / Universal Linksに優位性があります。
シームレスなアプリ起動が可能。(起動確認ダイアログなどのユーザーアクションを挟まない)
サーバー側に信頼できるドメインを設定でき、外部からのネイティブアプリの起動などを防ぐことができる。
アプリがインストールされていなかった際の挙動としてWebにフォールバックされるため、Webで複雑なフォールバック処理を考慮する必要がない。
App Links / Universal Linksはそれぞれ Android / iOS での技術仕様で以下のような対応になっています。
| Android | iOS |
|---|---|
| App Links | Universal Links |
Webサーバーとして所有権を証明する
優位性の内容でも触れたとおり、サーバー側に信頼できるドメインを設定することで対象ドメインからの特定のリクエストをトリガーにネイティブアプリを起動することになります。
そのため、それぞれ https://example.com/.well-known/ 配下に特定の形式のファイルを配布します。
Androidでは assetlinks.json。iOSでは apple-app-site-association で配布することが仕様として定められています。
完全にpublicな情報なので、実際にエンドポイントへアクセスすると YouTube で設定されている内容を確認できます。
https://www.youtube.com/.well-known/assetlinks.json
https://www.youtube.com/.well-known/apple-app-site-association
細かい設定内容について以下にまとめておきます。
App Links(Android)
| キー | 解説 |
|---|---|
relation |
アプリに与える権限を指定します。通常は「すべてのURLを処理する」という意味の delegate_permission/common.handle_all_urls を指定します。 delegate_permission/common.get_login_creds なども指定が可能です。 |
target.namespace |
Androidアプリを指す android_app を固定で指定します。 |
target.package_name |
アプリのパッケージ名(applicationId)を指定します。 |
target.sha256_cert_fingerprints |
アプリを署名した証明書の SHA-256 フィンガープリントです。これが一致しないと App Links は有効になりません。 |
詳しくは アプリリンクについて | App architecture | Android Developers を参照してください。
Universal Links(iOS)
apps配下
レガシーな設定項目です。iOS 13.0+ から新形式の指定方法が利用できるので、サポート対象がiOS 13.0以降であるならばdetails配下で指定をします。
details配下
| キー | 解説 |
|---|---|
# |
マッチする対象のURL Fragmentを指定できます。デフォルトで * が指定されます。 |
/ |
マッチする対象のURL Pathを指定できます。デフォルトで * が指定されます。 |
? |
マッチする対象のURL Query paramsを指定できます。デフォルトで * が指定されます。 |
caseSensitive |
大文字・小文字を区別するかどうかを指定します。デフォルトは true(区別する)です。 |
comment |
コメントです。OSの動作には影響しません。 |
exclude |
true を指定すると、このパターンに一致するURLを「アプリ起動の対象外(ブラウザで開く)」に設定できます。 |
percentEncoded |
URLエンコード(%20など)された状態の文字列でマッチング判定を行うかどうかを指定します。デフォルトは true です。 |
詳しくは applinks.Details.Components | Apple Developer Documentation を参照してください。
具体的なシーケンス
sequenceDiagram
autonumber
participant User as 利用者
participant OS as 端末
participant Server as Webサーバー (.well-known)
participant App as ネイティブアプリ
participant Browser as ブラウザ
Note over User, Server: アプリインストール/更新
User->>OS: アプリをインストール
OS->>Server: GET /.well-known/assetlinks.json (または AASA)
Server-->>OS: 200 OK (設定ファイルを返却)
Note over User, Server: URLアクセス時
User->>OS: URL アクセス
alt アプリインストール済み & 検証済み
OS->>App: アプリを直接起動 (URL情報を渡す)
Note over App: ※ネイティブ側でのURLパース・画面遷移
App-->>User: アプリ内の特定画面を表示
else アプリ未インストール / 未検証
OS->>Browser: ブラウザを起動
Browser-->>User: 通常のWebページを表示
end
最後に
今回はネイティブアプリをシームレスに開くためのWeb実装について書きました。
Web / HTTP通信の世界の外についてあまり触れる機会がなかったのでその仕組みや仕様について色々と知れてよかったです!
また STORES ではエンジニアを絶賛募集中です。 ぜひ採用サイトにも遊びに来てください。