😓
【Flutter, Android】Firebase Dynamic Linksでアプリが開けない時の対処法
こちら↓のパッケージを使うと、結構簡単にDynamic Linksを使うことができる。
ドキュメントもわかりやすいが、Androidについては一点注意が必要。
ドキュメントの手順通りに実装して、いざアプリを開こうとすると、開けない場合がある。
(↓こんな感じで、Play Storeが開かれる)
当初はまだストアに公開してないからか?と思ったが、そうではなく、ストア未公開でも正しく設定できていれば、アプリを開くことはできる。
問題は、android/app/src/main/AndroidManifest.xml
の内容。
ドキュメントには、以下のように書けとある。
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="example.com"
android:scheme="https"/>
</intent-filter>
だが、正しくは↓こう。
android:autoVerify="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:host="example.com"
android:scheme="https"/>
</intent-filter>
ドキュメントにはこの記載がなく、かなり詰まったので、同じような方がいれば助けになると嬉しい。
追記
flutter run
でデバッグしている分には上記の対応のみで問題なかったが、flutter build apk
でビルドした場合、うまく動作しなかった。
ビルド周りの知識が浅いので詳細はわからないが、signingConfig
の設定に原因があったと思われる。
そもそも、--dart-define
でDev/Prodを使い分けているのだが、signingConfig
については、特に環境ごとの設定をしていなかった。
以下のように修正したところ、buildしたアプリでも正常に動作するようになった。
android/app/build.gradle
を修正
// dart-define対応
def dartEnvironmentVariables = [:];
if (project.hasProperty('dart-defines')) {
dartEnvironmentVariables = dartEnvironmentVariables + project.property('dart-defines')
.split(',')
.collectEntries { entry ->
def pair = new String(entry.decodeBase64(), 'UTF-8').split('=')
[(pair.first()): pair.last()]
}
}
// (省略)
buildTypes {
release {
// --dart-defineの指定に合わせて使い分ける
signingConfig dartEnvironmentVariables.FLAVOR == 'prod'
? signingConfigs.release
: signingConfigs.debug
}
}
この辺は設定によって異なるので参考程度に残しておく。
Discussion