okaryo.log

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

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

    #Firebase#AppDistribution#Flutter#Android

はじめに

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

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

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

参考


関連記事
最新記事
プロモーション

This site uses Google Analytics.