我在 Flutter 应用程序中成功实现了推送通知,并通过 Firebase 控制台进行了测试。
我现在希望通过 API 向我的应用程序的所有设备发送通知。
Future<void> sendPushMessage() async {
try {
final response = await http.post(
Uri.parse('https://fcm.googleapis.com/fcm/send'),
headers: <String, String>{
'Content-Type': 'application/json',
'Authorization':
'key=xxx',
},
body: jsonEncode(
<String, dynamic>{
'to': '/topics/all',
'notification': <String, dynamic>{
'title': 'Hello FlutterFire!',
'body': 'This notification (#1) was sent via FCM!',
},
"android": {"priority": "high"},
},
),
);
print('Response status: ${response.statusCode}');
print('Response body: ${response.body}');
} catch (e) {
print(e);
}
}
回应:
Response status: 200
{"message_id":430407718266627xxxx}
设备没有收到任何通知。可能是什么问题呢?谢谢你。
使用这个package来显示通知。
在 main.dart
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
LocalNotificationService.initialize();
runApp(YourApp());
}
使用下面的代码来处理。
import 'dart:convert';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:get/get.dart';
class LocalNotificationService {
static final FlutterLocalNotificationsPlugin _notificationsPlugin =
FlutterLocalNotificationsPlugin();
static void initialize() async {
const AndroidInitializationSettings initializationSettingsAndroid =
AndroidInitializationSettings('@drawable/ic_notification');
//AndroidInitializationSettings('@mipmap/ic_launcher');
if (!kIsWeb && Get.currentRoute != Routes.CHAT) {
/// Update the iOS foreground notification presentation options to allow
/// heads up notifications.
await FirebaseMessaging.instance
.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
}
final DarwinInitializationSettings initializationSettingsDarwin =
DarwinInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
onDidReceiveLocalNotification:
(int id, String? title, String? body, String? payload) async {},
//notificationCategories: darwinNotificationCategories,
);
final LinuxInitializationSettings initializationSettingsLinux =
LinuxInitializationSettings(
defaultActionName: 'Open notification',
defaultIcon: AssetsLinuxIcon('icons/app_icon.png'),
);
final InitializationSettings initializationSettings =
InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin,
macOS: initializationSettingsDarwin,
linux: initializationSettingsLinux,
);
await _notificationsPlugin.initialize(
initializationSettings,
onDidReceiveNotificationResponse: notificationTapBackground,
onDidReceiveBackgroundNotificationResponse: notificationTapBackground,
);
/// Custom notification channel
const channel = AndroidNotificationChannel(
"add Your name",
"add Your name",
importance: Importance.max,
playSound: true,
);
await _notificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
}
static void notificationTapBackground(
NotificationResponse notificationResponse) async {
// handle action
final String? payload = notificationResponse.payload;
var data = json.decode(notificationResponse.payload ?? "");
}
//after initialize we create channel in displayNotification method
static void displayNotification(RemoteMessage message) async {
try {
final id = DateTime.now().millisecondsSinceEpoch ~/ 1000;
const NotificationDetails notificationDetails = NotificationDetails(
android: AndroidNotificationDetails(
"Your name",
"your name",
importance: Importance.max,
priority: Priority.high,
icon: '@drawable/ic_notification',
),
iOS: DarwinNotificationDetails(),
);
await _notificationsPlugin.show(
id,
message.notification!.title,
message.notification!.body,
notificationDetails,
payload: json.encode(message.data),
//payload: message.data['USER_REQUEST_SEND'],
);
} on Exception catch (e) {
print('Display Notification error : $e');
}
}
static void getNotificationPermission() async {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
NotificationSettings settings = await _firebaseMessaging.requestPermission(
alert: true,
announcement: false,
badge: true,
carPlay: false,
criticalAlert: false,
provisional: false,
sound: true,
);
print('User granted permission: ${settings.authorizationStatus}');
}
static void onNotification() async {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
// getInitialMessage: When the app is closed and it receives a push notification
_firebaseMessaging.getInitialMessage().then((RemoteMessage? message) async {
if (message != null) {
debugPrint('KilledOpenedApp data : ${message!.data}');
onTapNotification(message, true);
}
});
// onMessage: When the app is open and it receives a push notification
FirebaseMessaging.onMessage.listen(
(RemoteMessage message) {
debugPrint("onNotificationPayload : ${message.data}");
LocalNotificationService.displayNotification(message);
},
);
// replacement for onResume: When the app is in the background and opened directly from the push notification.
FirebaseMessaging.onMessageOpenedApp.listen(
(RemoteMessage message) async {
debugPrint('onMessageOpenedApp data : ${message.data}');
onTapNotification(message, false);
},
);
}
static void onTapNotification(RemoteMessage message, bool isKilled)
async {
// handle click events
}
}