FirebaseAppDistributionで配布したFlutterアプリでディープリンクが機能しないときの対処法
はじめに
先日、FirebaseAppDistributionで配布したアプリを検証環境で動作確認していたところ、ディープリンクが機能していないことを見つけた。
なんとか解決まで持っていけたが、ディープリンク、特にAndroidのアプリリンクの仕様について知らないことがあり、結構時間がかかってしまったのでまとめておく。
前提条件
Flutterのディープリンクのドキュメントに書かれているプラットフォームごとの設定は完了していることを前提としている。
- Android
AndroidManifest.xml
への設定の記述<webdomain>/.well-known/assetlinks.json
をホストしているサイトにデプロイし、正常なレスポンスが返ってくる
- iOS
FlutterDeepLinkingEnabled
の有効化- XCodeでCapabilityの
Associated Domains
にドメインを追加 <webdomain>/.well-known/apple-app-site-association
をホストしているサイトにデプロイし、正常なレスポンスが返ってくる
遭遇した現象
AppDistributionで配布したアプリをインストールした実機端末で、設定したドメインのディープリンクを踏んでもWebサイトに遷移してしまい、アプリを開くことができなかった。
この現象はAndroidでのみ発生し、iOSでは正常にディープリンクが機能した。
確認手順
ディープリンクの検証
まずはアプリがインストールされている端末とPCを接続し、adb
を使ってディープリンクが有効かどうかを確認する。アプリのパッケージ名を指定して、以下のコマンドを実行する。
adb -s DEVICE_ID adb shell pm get-app-links PACKAGE_NAME
# DEVICE_IDは`adb devices -l`で出力された端末ID。複数の端末と接続している場合は端末を指定する必要がある。
すると、以下の出力を得られた。
com.sample.android:
ID: xxxxx
Signatures: [xxxxx]
Domain verification state:
mydomain.com: 1024
ドメインの検証が完了していれば、ドメインの横にはverified
と表示されるらしい。自分の場合は1024
で、これはカスタムエラーコードらしい。要するにドメインの検証がうまくいっていない。
とはいえ、自分のドメインのサイトには正しくassetlinks.json
を設置しているし、レスポンスも正常に返ってくる。
SHA256署名フィンガープリントの確認
サイトは正常なので、ドメインとアプリの紐付けが失敗していると考え、assetlinks.json
と先ほどの出力に表示されているSHA256署名フィンガープリントを見比べてみたところ値が違っていた。自分はドキュメントの通りPlayConsoleで表示されているSHA256をassetlinks.json
に記述していたが、それとは違うSHA256が表示されていた。
自分のアプリはAABでビルドしているおり、AppDistributionから配布されたアプリをインストールする際もGooglePlayからインストールしているので、てっきりPlayConsoleでアプリ署名がされているものだと思っていた。しかし、調べてみるとそのSHA256はAppDistributionによって署名されたものだった。
AppDistributionのAndroidアプリのページで、各リリース横に表示されているaab
をホバーすると証明書を確認することができる。
これのSHA256をassetlinks.json
に登録する。
PlayConsoleのSHA256はストアからインストールしたアプリに、AppDistributionのものはそこからインストールしたアプリに使用するので、最終的にassetlinks.json
は以下のようになった。
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.sample.android",
"sha256_cert_fingerprints": [
"PlayConsole SHA256",
"AppDistribution SHA256"
]
}
}
]
これで、AppDistributionから配布されたアプリとディープリンクのドメインを紐づけられるようになった。
最後の落とし穴
上記のassetlinks.json
をサイトにデプロイし、これでディープリンクが機能すると思って確認してみると相変わらずディープリンクが機能していない。
ここが一番時間を使わされてしまったのだが、どうやらディープリンクのドメイン検証はアプリがインストールされたときに実行されるらしい。自分の場合は検証に失敗しているため、アプリをインストールし直すか、アプリの設定画面から手動でドメインを許可する必要があった。
アプリをインストールし直してディープリンクを踏んでみると、正常にアプリに遷移することができた。これでようやくディープリンクが正常に機能するようになった。
おわり
AppDistributionから配布されるアプリはAppDistributionで署名されていること、Androidではディープリンクのドメインとアプリの紐付けの検証がインストール時にされること、これらが自分の中でのハマりポイントだった。
この記事によって誰かの時間が浪費されることがなければ嬉しい。