JINSテックブログ
🐷

FlutterアプリでAndroid App Linksを設定してみた【2024/12】

2024/12/02に公開

この投稿は、2024年JINSのアドベントカレンダー2日目の記事です。

はじめに

以前iOSのUniversal Linksについて紹介しましたので、今回はAndroid App Links(以下App Links)について書いていきます!

App Linksとは

App Linksは、AndroidのためのDeeplink技術です
httpスキームとhttpsスキームを使用して、リンクからアプリを起動することができます

(例)https://example.comをタップすると紐づいたアプリが開く
   アプリをインストールしていない場合は、https://example.comのWebページをブラウザで開く

Flutter公式通りにやってみる

Customize a Flutter application

go_routerはApp Linksのパスによって起動するアプリ画面を変えたい場合に必要になります
(例)App Linksでアプリ起動時はホーム画面を表示したい など
単純にアプリを起動するだけであれば設定は不要です

今回は割愛します

Modify AndroidManifest.xml

activityタグ内に下記を設定します

<activity
    android:name=".MainActivity"
    ...
    >
    ...

    // ↓↓ここから下を設定する↓↓
    <meta-data android:name="flutter_deeplinking_enabled" android:value="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:scheme="https" android:host="example.com" />
    </intent-filter>
    // ↑↑ここまで↑↑

</activity>

詳細

<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />

FlutterでApp Linksを設定する場合に必要なメタデータになります

<intent-filter android:autoVerify="true">

自動でURLの検証を行う設定です

<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

上記3つの設定は必須になります

<data android:scheme="https" android:host="example.com" />

android:schemehttphttpsのみ設定できます
httpsでアクセスできる必要があるため基本的にはhttpsのみでOKです

android:hostはassetlinks.jsonを配置しているドメインを設定します

Hosting assetlinks.json file

assetlinks.jsonというファイルをサーバに配置します
サーバは各自用意する必要があります

下記例のようにアクセスできるようにします
例)https://example.com/.well-known/assetlinks.json

公式の参考例: assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.deeplink_cookbook",
    "sha256_cert_fingerprints":["FF:2A:CF:7B:DD:CC:F1:03:3E:E8:B2:27:7C:A2:E3:3C:DE:13:DB:AC:8E:EB:3A:B9:72:A1:0E:26:8A:F5:EC:AF"]
  }
}]

詳細

package_name

Androidのパッケージ名(build.gradle内のapplicationId)を設定してください

sha256_cert_fingerprints

アプリ署名するときのSHA256フィンガープリントを設定します

SHA256フィンガープリントの確認方法
  • Google Play Console

アプリのダッシュボードから、[テストとリリース]>[設定]>[アプリの署名]>[Digital Asset Links JSON]で確認することができます

まるっとコピーすればOKです!

  • ローカルのKeystore

開発途中でローカルのKeystoreファイル(*.keystore or *.jks)でビルドしたアプリで確認したい場合もあると思います

その場合でもKeystoreファイルからSHA256フィンガープリントを確認できます
keytool -list -v -keystore <path-to-keystore>
パスワードを入力するとSHA256フィンガープリントを確認できます

※ただし、ローカルで発行した証明書のフィンガープリントは通常ユーザーのデバイス上の証明書と一致しないようですので注意が必要です→Tipsを参照

Testing

メモ帳

メモ帳にhttps://example.com/を入力して、リンクをタップすることで検証することができます

adbコマンド

adb shell 'am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "https://example.com"' \
    <package name>

App Linksが動作しない時

App Linksが動作しない場合は、以下を確認してみてください

ドメインの関連付けができていない

ローカルの証明書でビルドした場合、関連付けができていない可能性があります
その場合は、アプリの設定から[デフォルトで開く]>[対応リンクを開く]で対象のリンクにチェックを入れます

assetlinks.jsonが公開されていない

assetlinks.jsonのサーバにアクセス制限をかけている場合は、検証ができないためApp Linksは動作しません
assetlinks.json配置後https://example.com/.well-known/assetlinks.jsonにアクセスできるか試してみてください

フィンガープリントが異なる

ビルド環境ごとにそれぞれ証明書を作成している場合もあると思います
その場合は別の証明書のフィンガープリントを設定していないか確認しましょう

リダイレクトでドメインを実行する

リダイレクトでApp Linksのドメインを実行している場合は、App Linksは動作しません

まとめ

最初はローカル環境の証明書でビルドしたアプリで検証していたため動作せずにつまづいてしまいましたが、なんとか動作することができました
Androidの公式にもったいろんな設定の記載があったので、複数のドメインの設定や、pathの設定など実施して更新があればまたアップしていきたいと思います!

参考

JINSテックブログ
JINSテックブログ

Discussion