问题
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