Я работаю над проектом Flutter, в котором настроил уведомления с помощью Firebase Messaging. До недавнего времени все работало идеально. После долгого возвращения в проект и повторного запуска кода приложение вылетает с сообщением ANR (приложение не отвечает) при получении уведомления.
Уведомление получено, и обработчик переднего плана получает данные, но затем приложение немедленно завершает работу.
После отладки я понял, что после получения уведомления что-то обрабатывается долго, что, вероятно, и приводит к сбою.
Для дальнейшего расследования я удалил все тяжелые задачи и оставил внутри обработчика только простой журнал печати, но сбой все равно происходит.
Вот сообщение об ошибке, отображаемое при сбое приложения:
ANR in com.company
PID: 24618
Reason: Broadcast of Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x11000010 pkg=com.company cmp=com.company/uk.orth.push.FirebaseMessagingReceiver (has extras) }
ErrorId: f29624e4-05d6-4b28-960f-81a2550b55eb
Frozen: false
Load: 3.89 / 3.9 / 3.99
Далее следуют другие статистические данные по памяти и процессору, которые, похоже, указывают на нагрузку на систему, но я больше не делаю ничего интенсивного в обработчике. Однако сбой продолжается.
Теперь я застрял и не знаю, что делать дальше.
Если кто-то сталкивался с подобной проблемой или знает, что может быть ее причиной, подскажите, как ее исправить.
вот код, вызывающий ошибку (фактический код отличается, но для этого кода он не работает)
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
// This is the background message handler. This should be run on a background isolate.
Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
print("Handling a background message: ${message.messageId}");
// Perform background processing here, but ensure no UI updates happen here.
// You can log data, fetch data, or update your database.
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
// Register the background message handler
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
@override
void initState() {
super.initState();
// Request notification permissions for iOS
_firebaseMessaging.requestPermission();
// Handle foreground messages
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print("Received message while the app is in the foreground: ${message.messageId}");
// Handle foreground notification here (e.g., show a dialog, update UI)
if (message.notification != null) {
print("Notification title: ${message.notification!.title}");
print("Notification body: ${message.notification!.body}");
}
});
// Handle message when the app is resumed from background (user taps on notification)
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print("Message clicked! Opening app...");
// Perform navigation or specific actions on notification tap
});
// Get the FCM token (to register the device for notifications)
_firebaseMessaging.getToken().then((String? token) {
print("FCM Token: $token");
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter FCM Demo',
home: Scaffold(
appBar: AppBar(
title: Text("Flutter FCM Demo"),
),
body: Center(child: Text("Push Notification Example")),
),
);
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... -even-with