我正在使用 Firebase Cloud Messaging (FCM) 在我的 Flutter 应用程序中发送推送通知。当应用程序位于前台和后台时,通知工作正常。但是,在我的 Oppo 设备上,当应用程序处于终止状态(关闭)时,不会出现通知。
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
// Main function
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
// Initialize local notifications
await initializeLocalNotifications();
// Get Firebase Messaging instance
FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance;
// Get FCM Token
firebaseMessaging.getToken().then((token) {
print("FCM Token: $token");
});
// Handle notification taps
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print("User tapped on the notification!");
});
// Handle incoming messages while the app is in the foreground
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print("Received message: ${message.notification?.body}");
// Call function to show notification
showLocalNotification(
message.notification?.title ?? 'Notification',
message.notification?.body ?? '',
);
});
runApp(const Work360App());
}
Future<void> initializeLocalNotifications() async {
const initializationSettingsAndroid =
AndroidInitializationSettings('ic_launcher');
const initializationSettingsIOS = DarwinInitializationSettings();
const initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
);
await flutterLocalNotificationsPlugin.initialize(initializationSettings);
if (Platform.isAndroid) {
const androidNotificationChannel = AndroidNotificationChannel(
'high_importance_channel',
'High Importance Notifications',
description: 'This channel is used for important notifications.',
importance: Importance.max,
);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(androidNotificationChannel);
} else if (Platform.isIOS) {
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
IOSFlutterLocalNotificationsPlugin>()
?.requestPermissions(alert: true, badge: true, sound: true);
}
}
Future<void> showLocalNotification(String title, String body) async {
const androidNotificationDetails = AndroidNotificationDetails(
'high_importance_channel',
'High Importance Notifications',
channelDescription: 'This channel is used for important notifications.',
importance: Importance.max,
priority: Priority.high,
);
const iOSNotificationDetails = DarwinNotificationDetails();
const notificationDetails = NotificationDetails(
android: androidNotificationDetails,
iOS: iOSNotificationDetails,
);
await flutterLocalNotificationsPlugin.show(0, title, body, notificationDetails);
}
我尝试过的: 确保 Firebase 在主函数中正确初始化。 在手机设置中检查了该应用程序的通知权限。 已验证通知在前台和后台状态下都能正常工作。 添加了 Android 必要的通知通道,如代码所示。 检查是否有任何可能影响通知传递的特定于应用程序的电池优化设置。
什么有效: 当应用程序在 Oppo 设备上的前台和后台时会收到通知。
1。电池优化设置:
转到“设置”>“电池”>“电池优化”。 找到您的应用程序并确保它未经过优化。这将允许应用程序即使在终止时也能接收通知。
2。自动启动权限:
Oppo 设备通常要求允许应用程序自动启动。 进入设置 > 应用管理 > 自启动管理。 找到您的应用程序并启用自动启动。
3.后台权限:
确保您的应用程序有权在后台运行。 转到“设置”>“隐私”>“后台运行的应用程序”。 确保您的应用程序允许在后台运行。
4。推送通知设置:
在某些 Oppo 设备上,可能有推送通知的特定设置。 转至设置 > 通知和状态栏 > 管理通知。 确保您的应用程序启用了通知。
5。检查其他特定于设备的设置:
某些 Oppo 设备具有额外的安全或电池设置,可能会阻止通知。请务必检查设备的设置,以确保应用程序终止时不会阻止运行。
6。 FCM 实施:
考虑在通知旁边添加自定义数据消息。这可确保您的应用程序接收数据,即使应用程序终止,也可以在后台处理这些数据。
// Example FCM message with both notification and data payload
{
"to": "device_token",
"notification": {
"title": "Notification Title",
"body": "Notification Body"
},
"data": {
"key1": "value1",
"key2": "value2"
}
}
测试: 进行这些更改后,重新启动设备并测试以查看应用程序终止时是否收到通知。如果它们仍然无法工作,请考虑使用不同的测试设备或模拟器,以确保问题是特定于设备的。