🌊
FlutterでFirebase AppCheckのDebugProviderでハマった
FlutterでFirebaseAppCheckを使いたい
- Flutterプロジェクトの作成
- FirebaseProjectの作成
- FirebaseAppCheckの導入
は既に終わっている前提で話を進めます。
公式ドキュメント
FlutterではDebugProvider自体まだ実装されていませんので、ドキュメントも用意されておらず。
公式のアップデートを待ってもよいのですが、対応される気配が無いため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見つけました。
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
を使うための設定も必要でした。
これでxcode上でデバッグトークンが出力されるはずです。
Discussion