How to fix app crash on recieving FCM Push Notification built on Flutter

时光怂恿深爱的人放手 提交于 2021-01-27 22:56:27

问题


I have built an app on Flutter and was trying to send Push Notifications through FCM. Earlier it was working but after changing the version of Firebase messaging the app crashes as soon as I send a push notification.

I haven't made any changes in the Code per se. I looked into the GitHub issues but couldn't resolve it.

This is the code I have been using in the main.dart file.

final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

  void initState() {
    super.initState();

    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) {
        print('on message $message');
      },
      onResume: (Map<String, dynamic> message) {
        print('on resume $message');
      },
      onLaunch: (Map<String, dynamic> message) {
        print('on launch $message');
      },
    );
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(sound: true, badge: true, alert: true));
    _firebaseMessaging.getToken().then((token){
      print(token);
    });

My firebase_messaging dependency

  firebase_messaging: ^1.0.2

I had also changed the version of google-services in app/build.gradle

dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.0'
    }

This is the part added to the AndroidManifest.xml file for notifications

 <intent-filter>
     <action android:name="FLUTTER_NOTIFICATION_CLICK" />
     <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>

The Device Log

03-24 19:14:25.044 2630 2663 I ActivityManager: Start proc 17709:com.example.notif_app/u0a206 for broadcast com.example.notif_app/com.google.firebase.iid.FirebaseInstanceIdReceiver 03-24 19:14:25.047 17709 17709 I art : Late-enabling -Xcheck:jni 03-24 19:14:25.181 17709 17709 D FirebaseApp: com.google.firebase.auth.FirebaseAuth is not linked. Skipping initialization. 03-24 19:14:25.182 17709 17709 D FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization. 03-24 19:14:25.182 17709 17709 I FirebaseInitProvider: FirebaseApp initialization successful 03-24 19:14:25.199 17709 17730 I ResourceExtractor: Found extracted resources res_timestamp-1-1553431828587 03-24 19:14:25.206 17709 17727 I FA : App measurement is starting up, version: 15300 03-24 19:14:25.206 17709 17727 I FA : To enable debug logging run: adb shell setprop log.tag.FA VERBOSE 03-24 19:14:25.207 17709 17727 I FA : To enable faster debug mode event logging run: 03-24 19:14:25.207 17709 17727 I FA : adb shell setprop debug.firebase.analytics.app com.example.notif_app 03-24 19:14:25.220 17709 17709 D AndroidRuntime: Shutting down VM 03-24 19:14:25.221 17709 17709 E AndroidRuntime: FATAL EXCEPTION: main 03-24 19:14:25.221 17709 17709 E AndroidRuntime: Process: com.example.notif_app, PID: 17709 03-24 19:14:25.221 17709 17709 E AndroidRuntime: java.lang.NoSuchMethodError: No static method zzad()Lcom/google/firebase/iid/zzan; in class Lcom/google/firebase/iid/zzan; or its super classes (declaration of 'com.google.firebase.iid.zzan' appears in /data/app/com.example.notif_app-1/base.apk:classes2.dex) 03-24 19:14:25.221 17709 17709 E AndroidRuntime: at com.google.firebase.messaging.FirebaseMessagingService.zzb(Unknown Source) 03-24 19:14:25.221 17709 17709 E AndroidRuntime: at com.google.firebase.iid.zzb.onStartCommand(Unknown Source) 03-24 19:14:25.221 17709 17709 E AndroidRuntime: at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3318) 03-24 19:14:25.221 17709 17709 E AndroidRuntime: at android.app.ActivityThread.-wrap21(ActivityThread.java)

Can anyone help me with this? Thanks in advance.


回答1:


Open the android project.

Go the build.gradle of firebase_messaging

In the dependencies change api 'com.google.firebase:firebase-messaging:18.0.0' to api 'com.google.firebase:firebase-messaging:17.3.3'

Make sure you are using the latest version of all the cloud dependencies in pubspec.yaml

This solution worked for me




回答2:


Just run flutter clean and run your app again.




回答3:


In my case, I followed the plugin instructions https://pub.dev/packages/firebase_messaging but still, my Android app crashed.

The reason was in file android/app/src/main/kotlin/com/example/app/MainActivity.kt

When I changed it to

package YOUR.APP.PACKAGE

import io.flutter.embedding.android.FlutterActivity
import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

class Application : FlutterApplication(), PluginRegistrantCallback {

    override fun onCreate() {
        super.onCreate()
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
    }

    override fun registerWith(registry: PluginRegistry?) {
        io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
    }
}

The crash has gone.

Also just in case, the code to listen for coming pushes, there is important to have the handler for onBackgroundMessage

static Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async { print(message); return Future<void>.value(); }

firebaseMessaging.configure(
      // when app is open
      onMessage: (Map<String, dynamic> message) async {
        try {
          Get.defaultDialog(
              title: message['notification']['title'] ?? 'New reaction to comment',
              middleText: message['notification']['body'] ?? 'Click to react',
              textCancel: 'Cancel',
              textConfirm: 'See',
              onCancel: () {},
              onConfirm: () => PushServices.managePushesLinkToProject(message));
        } catch (e) {
          print('$e');
        }
      },
      onLaunch: (Map<String, dynamic> message) async {
        PushServices.managePushesLinkToProject(message);
      },
      onResume: (Map<String, dynamic> message) async {
        PushServices.managePushesLinkToProject(message);
      },
      onBackgroundMessage: myBackgroundMessageHandler,
    );

The key solution was found here https://github.com/FirebaseExtended/flutterfire/issues/2311



来源:https://stackoverflow.com/questions/55323403/how-to-fix-app-crash-on-recieving-fcm-push-notification-built-on-flutter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!