FirebaseAppDistributionで配布したFlutterアプリでディープリンクが機能しないときの対処法

はじめに

先日、FirebaseAppDistributionで配布したアプリを検証環境で動作確認していたところ、ディープリンクが機能していないことを見つけた。

なんとか解決まで持っていけたが、ディープリンク、特にAndroidのアプリリンクの仕様について知らないことがあり、結構時間がかかってしまったのでまとめておく。

前提条件

Flutterのディープリンクのドキュメントに書かれているプラットフォームごとの設定は完了していることを前提としている。

Deep linking
Navigate to routes when the app receives a new URL.
Deep linking favicon docs.flutter.dev
Deep linking

遭遇した現象

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をホバーすると証明書を確認することができる。

AppDistribution AAB

これのSHA256をassetlinks.jsonに登録する。

AppDistribution SHA256

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ではディープリンクのドメインとアプリの紐付けの検証がインストール時にされること、これらが自分の中でのハマりポイントだった。

この記事によって誰かの時間が浪費されることがなければ嬉しい。

参考

Verify Android App Links  |  Android Developers
Verify Android App Links  |  Android Developers favicon developer.android.com
Verify Android App Links  |  Android Developers