Android AppLinksについて

この記事は [ZOZO Advent Calendar 2021](https://qiita.com/advent-calendar/2021/zozo) カレンダー2の25日目です。

## AppLinksとは
あるURLをIntent FilterとしてアプリのManifestファイルに定義することで、定義したURLからアプリを起動することが出来るようになりますが、httpやhttpsといったschemeの場合は反応するアプリも多いですし、毎回目的のアプリを選択するのは面倒です。

AppLinksに対応することで、特定のURLに直接アプリを関連付けることが出来、前述のような煩わしさが全くなくシームレスにアプリを起動することが出来るようになります。

公式ドキュメントでは、さらに詳しく解説されています。

https://developer.android.com/training/app-links?hl=ja#app-links-vs-deep-links

正直、新しいトピックではありませんが、Android 12で加えられた変更点も交えて書いていきたいと思います。

## 実装方法

初めてアプリをAppLinksに対応させる場合は、Android Studioの機能であるApp Links Assistantを利用するとスムーズに漏れなく修正出来ると思います。
下図のように、必要なステップをガイド付きで進めていくことが出来ますし、最後には動作確認まで行う新設設計となっています。

![スクリーンショット 2021-12-25 0.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281445/d8655d9a-4f90-9ae4-84e4-6b128b84932a.png)

主に必要な実装は、下記３つになります。

1. Intent Filterの追加
2. AppLinksによってアプリが起動した際のIntentデータのハンドリング
3. アプリに関連付けたいウェブサイトに配置するファイルの作成

### 実装サンプル

仮に弊社 [ZOZOTOWN](https://zozo.jp) サイトを関連付けたいとした場合、Intent Filterは次のように定義する必要があります。

```xml:AndroidManifest.xml
    <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme">
        
        <intent-filter 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="zozo.jp"
                android:scheme="https" />
        </intent-filter>
```

また、ウェブサイト側に配置するJSONファイルは以下のようになります。
作成したら、サイトトップ直下に `.well-known` というディレクトリを作成しJSONファイルを配置します。

```json:applinks.json
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
        ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]
```

※ `package_name` と `sha256_cert_fingerprints` は仮の値です。実際のアプリの値に置き換える必要があります。
※ applinks.jsonファイルに関しては、いくつか注意点があるので[公式ドキュメントの注意点](https://developer.android.com/training/app-links/verify-site-associations?hl=ja#publish-json)をチェックしておくと、確認がスムーズになります。
※ applinks.jsonファイルの内容が正しいかの確認は、[このチェックページ](https://developers.google.com/digital-asset-links/tools/generator?hl=ja)が便利です。（ファイルの生成も可能です。）

## Universal Links (iOS)との比較

iOSにも同じような仕組みがありますが、Android AppLinksと仕様や挙動が異なります。
簡単に比較した表を作成してみました。

 |AppLinks|Universal Links
---|---|---
対象Pathの指定場所|アプリ|JSONファイル
対象Fragmentの指定場所|指定不可|JSONファイル
対象Parameterの指定場所|指定不可|JSONファイル
アプリ起動有無の指定|不可|可能
同一ドメイン内でのWebサイト回遊時(*1) |アプリ起動する|アプリ起動しない
JSONファイルの読み込みタイミング|アプリインストールかアップデート時|アプリインストールかアップデート時もしくは一定周期(*2)

*1: 例えばWebブラウザでZOZOTOWNのサイトを閲覧中にページ遷移が発生した際、遷移元URLと遷移先URLがどちらもアプリ起動の条件を満たしていた場合に、アプリが起動するかどうか。
*2: タイミングはシステム側で判断するようなので固定周期では無いものの、およそ１週間に１回程度らしい。

なおUniversal Linksについては、弊社[@chichilam](https://qiita.com/chichilam)が23日目の記事で詳しく解説していますので、もし良かったらご覧ください。

https://qiita.com/chichilam/items/9b646cdf4409d287195b

## Android 12での変更点

Android 12以降をターゲットにしたアプリでは、AppLinks関連にアップデートが２点入っています。

１点目はドメインの検証が簡単になったことです。
参考：[ドメインの検証を手動で呼び出す](https://developer.android.com/about/versions/12/web-intent-resolution?hl=ja#manually-invoke-domain-verification)

２点目はウェブサイトとアプリの関連付けを行うかどうかを、ユーザーに選択してもらうことが可能になったことです。
参考：[アプリをドメインに関連付けるようユーザーに依頼する](https://developer.android.com/about/versions/12/web-intent-resolution?hl=ja#request-user-associate-app-with-domain)

上記はAndroid 12以降の機能のため、実際に広く普及するのはもう少し先になりそうですが、AppLinksの対応がややスムーズになっていきそうです。

## まとめ

AndroidにおけるAppLinks実装方法の簡単な紹介と、Universal Linksとの比較やAndroid　12での変更点にも触れていきました。
今回まとめてみて、iOSに比べるとできることの幅が狭いなと感じたので[GoogleのDigital Asset Links](https://developers.google.com/digital-asset-links/v1/getting-started?hl=ja)側でも、Universal Linksと同等の機能を提供してくれるといいなと思いました。