Firebase Cloud Messaging API:消息已发送,但设备未收到

问题描述 投票:0回答:1

我在 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}

设备没有收到任何通知。可能是什么问题呢?谢谢你。

flutter firebase push-notification firebase-cloud-messaging
1个回答
0
投票

使用这个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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.