🌊

FlutterでFirebase AppCheckのDebugProviderでハマった

2022/08/29に公開

FlutterでFirebaseAppCheckを使いたい

  • Flutterプロジェクトの作成
  • FirebaseProjectの作成
  • FirebaseAppCheckの導入
    は既に終わっている前提で話を進めます。

公式ドキュメント

https://firebase.google.com/docs/app-check/flutter/default-providers

FlutterではDebugProvider自体まだ実装されていませんので、ドキュメントも用意されておらず。
https://firebase.google.com/docs/app-check/flutter/debug-provider

公式のアップデートを待ってもよいのですが、対応される気配が無いためNative側で実装する必要がありそう

Android

特に問題なくDebugProviderが使える印象

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        GeneratedPluginRegistrant.registerWith(flutterEngine)

        FirebaseDebugSetting.debugSetup(this)
    }
}

DebugProviderのセットアップ
注意:Debug実行でのみDebugProviderを使います

import android.content.Context
import com.google.firebase.FirebaseApp
import com.google.firebase.appcheck.FirebaseAppCheck
import com.google.firebase.appcheck.debug.DebugAppCheckProviderFactory
import io.flutter.BuildConfig

object FirebaseDebugSetting {

    fun debugSetup(context: Context) {
        if (BuildConfig.DEBUG) {
            FirebaseApp.initializeApp(context)
            val firebaseAppCheck = FirebaseAppCheck.getInstance()
            firebaseAppCheck.installAppCheckProviderFactory(
                DebugAppCheckProviderFactory.getInstance()
            )
        }
    }
}

上記の実装でビルド&実行します。
AndroidのLogcat上でデバッグトークンが出力されるはず。
それをFirebaseコンソールに登録します。

iOS

iOSは詳しくないため、めっちゃハマりました。。。

まず、公式に掲載の下記コードを持ってきても動きません。
アプリがクラッシュします🤮

let providerFactory = AppCheckDebugProviderFactory()
AppCheck.setAppCheckProviderFactory(providerFactory)

FirebaseApp.configure()

StackOverFlowやGithubのIssueでも具体的な解決策が無いためしばらく放置してましたが、
数日前に更新されたばかりのIssue見つけました。

https://github.com/firebase/flutterfire/issues/8969#issuecomment-1202544521

russellwheatleyさんのコメントではDebugLogの出し方と、Native側での実装例が書かれています(ObjCだけど)
Swiftに読み替えると下記のコードになります。

import UIKit
import Flutter
import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
      
      #if DEBUG
      let providerFactory = AppCheckDebugProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      #endif
      GeneratedPluginRegistrant.register(with: self)
      
      return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

FirebaseApp.configure()は不要でGeneratedPluginRegistrant.register(with: self)の実行をAppCheckのあとに走らせるだけですね!

あと、自分の環境では#if DEBUGを使うための設定も必要でした。
https://stackoverflow.com/a/30013587

これでxcode上でデバッグトークンが出力されるはずです。

Discussion