본문 바로가기
Programming/Flutter

[Flutter] Unable to create service io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService: java.lang.RuntimeException: PluginRegistrantCallback is not set.

by SpiralMoon 2020. 4. 17.
반응형

Stacktrace

Fatal Exception: java.lang.RuntimeException

Unable to create service io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService: java.lang.RuntimeException: PluginRegistrantCallback is not set.

발생 원인

발생 조건

  • v2 embedding이 적용된 플러터 안드로이드 프로젝트
  • Firebase_messaging 패키지를 사용

사용자 문제는 아니고 Firebase_messaging 패키지가 v2 embedding을 제대로 적용하지 않아서 생긴 문제이다.

플러터에서 네이티브 코드를 호출하기 위해서는 패키지 내부 소스코드에서 플러그인 등록을 하는 과정이 필요한데, 그 부분을 놓친 상태에서 배포된 듯 하다.

 

※ 2020.04.17 까지도 안고쳐지고 있다.


해결 방법

누락된 플러그인 등록 과정을 수동적으로 넣어주면 임시방편으로 해결할 수 있다.

 

// android/app/build.gradle
dependencies {
    
    ...
    
    implementation 'com.google.firebase:firebase-messaging:20.1.5'
}

 

앱 수준의 build.gradle에 firebase-messaging 패키지를 수동으로 추가한다.

 

import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;

public final class FirebaseCloudMessagingPluginRegistrant {
    public static void registerWith(PluginRegistry registry) {
        if (alreadyRegisteredWith(registry)) {
            return;
        }
        FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
    }

    private static boolean alreadyRegisteredWith(PluginRegistry registry) {
        final String key = FirebaseCloudMessagingPluginRegistrant.class.getCanonicalName();
        if (registry.hasPlugin(key)) {
            return true;
        }
        registry.registrarFor(key);
        return false;
    }
} 

 

FirebaseCloudMessagingPluginRegistrant 클래스를 직접 정의한다.

 

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;

public class Application extends FlutterApplication implements PluginRegistrantCallback {

    @Override
    public void onCreate() {
        super.onCreate();
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
    }

    @Override
    public void registerWith(PluginRegistry registry) {
        FirebaseCloudMessagingPluginRegistrant.registerWith(registry);
    }
} 

 

Application 클래스를 위 처럼 직접 정의하고 FirebaseCloudMessagingPluginRegistrant의 regiseterWith 함수를 호출하도록 구현해준다.

Application 클래스가 이미 있으면 수정해서 쓰고 없으면 MainActivity와 같은 디렉토리에 새로 정의한다.

 

<!-- AndroidManifest.xml -->
<application
        android:name=".Application">
        
        ...
</application>

 

AndroidManifest.xml의 application 태그에 android:name 속성을 추가하면 해결된다.


관련 문서

 

firebase_messaging | Flutter Package

Flutter plugin for Firebase Cloud Messaging, a cross-platform messaging solution that lets you reliably deliver messages on Android and iOS.

pub.dev

 

[firebase_messaging] No documentation for Android v2 embedding backgroundMessage handler · Issue #1775 · FirebaseExtended/flutte

Describe the bug Currently the documentation does NOT support the new Flutter Android v2 embedding that came along with flutter 1.12.13. The function GeneratedPluginRegistrant.registerWith(registry...

github.com

 

Flutter Tutorial: Firebase Cloud Messaging FCM Push Notification

A comprehensive step by step Flutter tutorial on integrating Firebase Cloud Messaging (FCM) push notification to Android and iOS Apps

www.djamware.com

 

반응형

댓글