ディープリンクの実装（AppLink編Android）

# 概要
AppLinkを奮闘して、実装したので、書き留めます。
実装仲間の助けになることを願って🙏

iOSはこちら！*アプリ側の準備もこちらの前半で説明してます。
[ディープリンクの実装（ユニバーサルリンク編iOS）](https://qiita.com/saburo555/items/d3a5122f05fe9a9dc2db)

# 環境
Angular
capacitor

# androidのappLinks実装
## 手順
1.サイトアソシエーションファイルの作成
Android の証明書の SHA256 フィンガープリントを使用する。
```
keytool -list -v -keystore my-release-key.keystore
```
![keystore-sha256-8d06695d59fbbf891f5c04c404f5e6e2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/88489411-9c9f-fcc4-fa38-729edc5430d1.png)

参照：[サイトアソシエーションファイルの作成](https://capacitorjs.jp/docs/guides/deep-links#%E3%82%B5%E3%82%A4%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90-2)

:::note info
上記でcapacitorの公式の説明が書いてあったが、私の実装では「Androidは証明書はGoogleコンソールの証明書鍵」を使用したら連携ができた。
:::

次に、[Asset Links tool](https://developers.google.com/digital-asset-links/tools/generator?hl=ja)を利用して、Site Associationファイルを作成する。

![android-config-032c0bc4890ee44d1c7e788cd6470390.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889120/aed69920-514b-9452-0e99-7e6051f437b6.png)
参照：[サイトアソシエーションファイルの作成](https://capacitorjs.jp/docs/guides/deep-links#%E3%82%B5%E3%82%A4%E3%83%88%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90-2)

JSON出力を .well-known配下にassetlinks.jsonにコピぺする。

```
// assetlinks.json
[
  {
    "relation": ["delegate_permission/common.handle_all_urls"],
    "target": {
      "namespace": "android_app",
      "package_name": "com.netkosoft.beerswift",
      "sha256_cert_fingerprints": ["43:12:D4:27:D7:C4:14..."]
    }
  }
]
```

上記ファイルをデプロイした後に、[Asset Links tool](https://developers.google.com/digital-asset-links/tools/generator?hl=ja)で「Test statement」を押して、成功が出れば、ほぼアプリ側と連携できている。

:::note warn
ここで成功となっていても、他の原因でアプリ側との連携ができな場合があります。その際は、証明書が正しいかなどを確認してください！
::: 

2.インテント・フィルタの追加
AndroidManifest.xml の <activity> 要素内に、以下を追加する。
```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="https" android:host="beerswift.app" />
</intent-filter>
```
完成形
```xml
<activity
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:name="com.netkosoft.beerswift.MainActivity"
    android:label="@string/title_activity_main"
    android:theme="@style/AppTheme.NoActionBarLaunch"
    android:launchMode="singleTask">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <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="https" android:host="beerswift.app" />
    </intent-filter>
</activity>
```
参照：[インテント・フィルタの追加](https://capacitorjs.jp/docs/guides/deep-links#%E3%82%A4%E3%83%B3%E3%83%86%E3%83%B3%E3%83%88%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%AE%E8%BF%BD%E5%8A%A0)

## エミュレータでの確認の際の注意点
リンクを直接クリックしてのテストができなかった。（ボタンとかではなく、リンク自体をクリック）
そのため、コマンドを叩き、リンクをクリックさせ、機能しているか確認した。
参考にしたページ：[【Android】adbコマンドを使えるよう設定する](https://itechblog.hatenablog.com/entry/2023/09/18/111514#google_vignette)

adbコマンドを使えるようにした後
コマンド（ターミナル）
```bash
% cd /Users/{ユーザーネーム}/Library/Android/sdk/platform-tools
```

デバイス上のアプリがどのようなURLパターンと関連付けられているかを確認するコマンド
```bash
% adb shell pm get-app-links {パッケージネーム}
```
情報が1024の場合は、証明書の確認をする。
参考：[How to resolve Android get-app-links Returns State 1024?](https://stackoverflow.com/questions/73737278/how-to-resolve-android-get-app-links-returns-state-1024)

ディープリンクチェック
```bash
% adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d “https://{ディープリンクドメイン}/{deeplink}”
```
{deeplink}は、ディープリンクのファイルのURLを指定。

## つまりポイント
途中でも書いてしまったが、証明書です。
アプリのどの環境と紐付けたいかにもよるのかもしれないです。
私は、最終的に「Androidは証明書はGoogleコンソールの証明書鍵」を使用して、成功しました。

# ディープリンクのはまりどころ
はまったところ
- 遷移元とディープリンクのドメインは同じではいけない。
- JavaScriptで、ディープリンクを起動させることができない。

この記事が助けになり抜け出せました。。。
[iOS Universal Links対応のTipsとハマりどころ](https://qiita.com/m-komatsu/items/2ca7cfa6426802ea9cb5)


# まとめ
ディープリンクは、思った以上に大変でした。
とはいえ、前駆者がいたため、何とか実装できました。
今後は、他のページにも遷移できるように、実装を応用していけるといいなと思います。

その時はこの辺が参考になるかも。
[App Linksに対応してみた](https://qiita.com/noboru_i/items/fd4634ecb326b3749ac0)