STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

App Links / Universal LinksにWeb対応してモバイル端末でネイティブアプリを開く

こんにちは。STORES でWebエンジニアをしていますosdです。

今回はHTTP URLを介してユーザーにネイティブアプリを起動させる仕組みについて実装をしたので、仕様を交えつつWebサーバーとして配布する項目を中心に解説します。

WebのURL エンドポイントを用いてシームレスにネイティブアプリを起動する仕組みです。

従来のディープリンクと呼ばれる技術は存在しましたが、以下の点で App Links / Universal Linksに優位性があります。

  1. シームレスなアプリ起動が可能。(起動確認ダイアログなどのユーザーアクションを挟まない)

  2. サーバー側に信頼できるドメインを設定でき、外部からのネイティブアプリの起動などを防ぐことができる。

  3. アプリがインストールされていなかった際の挙動として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 ではエンジニアを絶賛募集中です。 ぜひ採用サイトにも遊びに来てください。

jobs.st.inc