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

ブラウザや別アプリからアプリを起動したい時に
特定の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

```json
[{
  "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端末以降では、このアプリリンクが有効/無効でデフォルト起動の見え方が違います。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238700/48f0ba8d-af9f-e06f-52f7-b6b8996545f7.jpeg">


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

**有効化の確認方法**

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

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