背景:我有一个flutter应用程序,其中我的目标是处理推送通知消息与firebase消息传递给订阅主题的用户。通知与使用处理程序中的SharedPreferences本地保存的数据一起发送。这适用于6个场景中的5个。
此场景适用于Android和IOS:
1.应用程序位于前台,调用处理程序并存储数据。
1.应用程序在后台,但没有被杀死/终止。调用处理程序并存储数据。
1.[仅适用于Android]应用程序从打开的应用程序视图终止。
当应用程序终止时,没有调用onBackgroundMessage()
处理程序(即使推送通知通过并显示)的一个场景是在IOS上。然而,当您在第一个推送通知之后发送第二个推送通知时,处理程序会起作用,因为第一个推送通知会唤醒应用程序。
我甚至尝试使用getInitialMessage()
来获取一个消息后,打开应用程序,我把我的main()
功能。然而,该处理程序也不会被调用。因此,我目前无法处理流中的数据,这些数据来自iOS上的firebase推送通知,即使用户确实收到了推送通知。
我已经做过的事情:
- 所有的内容都描述了here,直到高级步骤(在我的用例中我不需要自定义图像)
- 我还启用了后台处理,以确保安全。
- 使用真实的设备而不是模拟器进行测试。
- 使用
flutter run --release
在发布模式下运行应用程序
下面是main
和处理程序:
Future<void> firebaseMessagingForegroundHandler(
RemoteMessage message, BuildContext context) async {
// print("Handling a foreground message: ${message.notification?.title}");
var prefs = await SharedPreferences.getInstance();
var unreadMessages = prefs.getString('unreadMessages') ?? "";
var readMessages = prefs.getString('readMessages') ?? "";
int lastIndex = await getLastTabIndex();
if (lastIndex == 2) {
if (readMessages.isEmpty) {
prefs.setString('readMessages', jsonEncode([message.data]));
} else {
var listWithReadMessages = jsonDecode(readMessages);
listWithReadMessages.add(message.data);
prefs.setString('readMessages', jsonEncode(listWithReadMessages));
}
} else {
if (unreadMessages.isEmpty) {
prefs.setString('unreadMessages', jsonEncode([message.data]));
} else {
var listWithUnreadMessages = jsonDecode(unreadMessages);
listWithUnreadMessages.add(message.data);
prefs.setString('unreadMessages', jsonEncode(listWithUnreadMessages));
}
}
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Nieuwe melding van ${message.data['sender']}')));
}
@pragma('vm:entry-point')
Future<void> firebaseMessagingBackgroundHandler(RemoteMessage message) async {
debugPrint("Handling a background message: ${message.messageId}");
//To ensure the sharedpreferences plugin is loaded in.
DartPluginRegistrant.ensureInitialized();
var prefs = await SharedPreferences.getInstance();
prefs.reload();
var unreadMessages = prefs.getString('unreadMessages');
if (unreadMessages == null) {
prefs.setString('unreadMessages', jsonEncode([message.data]));
} else {
var listWithUnreadMessages = jsonDecode(unreadMessages);
listWithUnreadMessages.add(message.data);
prefs.setString('unreadMessages', jsonEncode(listWithUnreadMessages));
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
var messaging = FirebaseMessaging.instance;
await messaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
FirebaseMessaging.onBackgroundMessage(firebaseMessagingBackgroundHandler);
await messaging
.getInitialMessage()
.then((message) => firebaseMessagingBackgroundHandler);
runApp(const ProviderScope(child: MyApp()));
}
我在initState()
中运行FirebaseMessaging.onMessage.listen((message)
,而不是在我的main()
中运行FirebaseMessaging.onMessage.listen((message)
。
1条答案
按热度按时间h5qlskok1#
在应用程序能够通过FCM接收消息有效载荷之前,必须满足一些先决条件:
*在iOS上,如果用户将应用从应用切换器上滑开,则必须手动重新打开应用,后台消息才能重新开始工作。
我的强调。Source。