😓

【Flutter, Android】Firebase Dynamic Linksでアプリが開けない時の対処法

2022/03/21に公開

こちら↓のパッケージを使うと、結構簡単にDynamic Linksを使うことができる。
https://pub.dev/packages/firebase_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