HTTP URLをAndroidアプリで開くために調べたこと

Androidアプリでは特定のドメインやパスのリンクをアプリで開くことができ、それによりアプリにユーザを誘導することができます。

リンクを開く方法は以下の３種類があります。
1. Deep Links
1. Web Links
1. Android App Links

ただし、これはAndroidでアプリを持っているユーザ限定です。ダウンロードしていないユーザに対しては、通常のWebブラウザで表示されます。
そもそもダウンロードからさせたいなどの場合は、Firebase Dynamic Linksなどが役に立つかもしれません。

# Deep Links　(iOSではCustom URL Scheme)
ユーザをアプリの特定の部分に遷移させる、**任意のスキームのURI**を指します。
AndroidManifest.xmlにインテントフィルターを追加し、URLとアプリを紐づけることができます。

```xml
<activity
    android:name=".MyMapActivity"
    android:exported="true"
    ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="geo" />
    </intent-filter>
</activity>
```

### 注意点
ディープリンクは、複数のアプリが同一のスキームを定義することができます。
そのため、開発者の意図しないアプリでURIが開かれる可能性があることに注意してください。
ディープリンクによっては、以下のような起動するアプリを選択するダイアログが表示される場合があります。


<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/db5da209-eedb-c82b-cb99-80500843035a.png">


# Web Links
**HTTPおよびHTTPSスキーム**を使用するディープリンクを指します。
Android12以降では、リンクをクリックしてもWebブラウザでコンテンツが表示されます。
Android11以下の場合は、ディープリンクと同様にアプリが開きます（ダイアログが表示される可能性もあります）。

```xml
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="http" />
    <data android:host="myownpersonaldomain.com" />
</intent-filter>
```

Android12以降で、HTTP　URLを開く場合は以下の2つの方法があります。

- App Linksを設定する
- 設定アプリでユーザに関連付けを行ってもらう
<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309460/21f020f9-1e09-2e69-5598-f0b8ad9f2b18.png">

https://developer.android.com/training/app-links/verify-android-applinks#check-app-already-approved

# Android App Links
Android App Linksは、HTTPおよびHTTPSスキームを利用し、autoVerify属性を含むWebリンクです。
ディープリンクやWebリンクと違い、アプリを選択するダイアログが表示されることはありません。

### メリット

- 他のアプリで開かれることがない
- シームレスな遷移を実現することができる
    - アプリをインストールしていないユーザに対しても通常のWebページが開く
- Android Instant　Appsで利用できる
- Google検索から直接遷移することができる

### 実装方法
他のリンクと違い、マニュフェストの追加だけでなく検証用のJSONファイルを公開する必要があります。

**1. マニフェストの書き方**
```xml
<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:scheme="http" />
    <data android:scheme="https" />

    <data android:host="myownpersonaldomain.com" />
</intent-filter>
```
**2. JSONファイルの設置**
以下のURLに検証用のJSONファイルを設置します。
`https://domain.name/.well-known/assetlinks.json`

JSONファイルにはアプリのパッケージ名、フィンガープリントなどを記載します。
複数のアプリの関連付けを記述しておくこともできます。
```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"]
  }
}]
```

詳しい書き方は以下を参照してください
https://developer.android.com/training/app-links/verify-android-applinks


## 参考文献
https://developer.android.com/training/app-links
https://developer.android.com/about/versions/12/web-intent-resolution?hl=ja
https://engineering.mercari.com/blog/entry/20220224-deeplink-for-mercari-shops/

!!注意!!
Androidのドキュメントは英語版を読むことをおすすめします。
日本語版は、翻訳が怪しかったり、そもそも内容が不十分なことが多いです。