LoginSignup
4

Android12以降でのAndroidアプリリンクの話

Posted at

ブラウザや別アプリからアプリを起動したい時に
特定のURLに紐付けてアプリ起動させる内容

公式の内容
https://developer.android.com/training/app-links/verify-android-applinks?hl=ja

前提の各種情報

以下の情報をまずは把握します。

**アプリのパッケージ名**
com.wakka0014.app

**ドメイン名**
wakka0014.ne

**アプリ公開鍵のSHA-256**
AA:BB:CC:DD……()

AndroidManifestの設定

   <activity
            android:name=".activity.DefaultLAunchActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="wakka0014.ne"
                    android:scheme="https" />
            </intent-filter>
    </acivity>

Jsonファイルを作成する
以下URLからjsonファイルを作成します。
上記各種情報を入力して「Generate statement」でjsonファイルならびに配置するjsonファイルのURLが発行される
https://developers.google.com/digital-asset-links/tools/generator

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target" : { "namespace": "android_app", "package_name": "com.wakka0014.app",
               "sha256_cert_fingerprints": ["AA:BB:CC:DD……()"] }
}]

配置するURL
https://wakka0014.ne/.well-known/assetlinks.json

ファイル名は「assetlinks.json」固定

アプリリンクが有効かどうか確認する
https://developers.google.com/digital-asset-links/tools/generator

同じくですが、上記URLから「Test statement」で検証し、成功であれば問題なし!

端末側の表示について

Android12端末以降では、このアプリリンクが有効/無効でデフォルト起動の見え方が違います。

画像の通りで、無効時はチェック項目があります。
有効時は認証がうまくいっているのでチェック項目がありません。

有効化の確認方法

端末の設定アプリ内のデフォルトアプリの起動が有効であればチェック項目がない

google公式のリンク有効をチェックして、OKであれば有効になっている

上記確認すればアプリリンクで起動できる!

懸念事項

jsonファイル公開して問題ないのか?
 jsonファイルに記載されているパッケージ名、ドメイン名はそもそもアプリ公開時に共有されている内容
 またSHA-256も公開鍵なので公開して問題ない内容

なぜこのような実装になったのか
 セキュリティ強化ならびにユーザーが選択してのデフォルトアプリ起動をさせず、Android側で自動的に
 アプリリンクを持たせて手間を省く狙いがあると思います

jsonファイルの認証について
 配置したjsonファイルはGoogleのサーバーが見に行って認証します。
 なのでVPN制限や国内制限(海外サーバーからの通信無効)は認証に失敗します。
 端末でVPN接続しても意味がありません。ここで認証にひっかかる問題が発生して大変だった。。

各開発環境ごとの設定について
 大概のアプリがdev環境、stg環境、本番環境と分けて対応すると思います。
 でそれぞれの開発環境ごとに使うドメインが異なる場合は、それぞれで分けてjsonファイルを配置する必要があります。
 例:dev環境 https://dev.wakka0014.ne/.well-known/assetlinks.json.
 例:本番環境 https://prod.wakka0014.ne/.well-known/assetlinks.json.
jsonファイルに配置する内容もパッケージ名やsha-256が異なるのであれば変更する必要があります。

【奥の手】ユーザーにチェックを入れてもらう
https://stackoverflow.com/questions/70953672/android-12-deep-link-association-by-user-fails-because-of-crash-in-samsung-setti
上記記事の内容の通り、アプリ側でデフォルトアプリ起動のチェックON/OFFが取れるので、
OFFの場合は外部アプリ起動しないように設定するとかで回避する方法です。
ただし、これはかなり奥の手なのでなるべくしたくない。。

感想

大変だった。。
jsonファイルをドメイン指定して配置するのはかなりハードル高いので、個人開発アプリでは厳しいんじゃないかと。
企業の大規模アプリでデフォルト起動の実装の時にお役に立てれば。。

【関連記事・参考になった内容】
・クックパッドさんの記事。概要的にかなりわかりやすかった
https://techlife.cookpad.com/entry/2022/05/31/100000

・Galaxyの固有設定があるとかなんとか。。マジ!?
https://stackoverflow.com/questions/70953672/android-12-deep-link-association-by-user-fails-because-of-crash-in-samsung-setti

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
4