首页 > 解决方案 > Flutter 推送通知仅在应用程序处于后台时有效

问题描述

我的问题是关于使用 Flutter 和 firebase_messaging 插件的推送通知

问题:

我已将firebase_messaging插件集成到我的颤振应用程序中以进行推送通知。当我收到推送通知时,我可以保证设置是正确的。仅当我的应用程序在后台运行(例如最小化但在系统内存中可用)时才收到推送时出现问题。当应用程序处于前台或被杀死时,不会收到推送。

为了提供我尝试过的解决方案,我无法弄清楚实际上需要做些什么。

我已经遵循了这方面的教程,并应用了每一个步骤来克服这个问题,但无济于事。

我正在使用 nodeJS 来处理 firebase-admin 和 serviceaccountkey 文件,因为我需要我的数据库中的 device_tokens。

节点JS

 const firebase = require('firebase-admin');
 const serviceAccount = require('../controller/firebase/serviceAccountKey.json');
 firebase.initializeApp({
  credential: firebase.credential.cert(serviceAccount)
 });

 //Function to actually implement the push
 const pushNotificationInitiatorSubscription = (resultValue) => {
 let devicesTokenString = resultValue[0]['device_token'];
 const firebaseToken = devicesTokenString;
 const payLoad = {
   notification: {
   title: 'New Subscription',
   body: 'You have a new subscription to your material ' + resultValue[0]['course_name']
 }
};
const option = {
 priority: 'high'
};

firebase.messaging().sendToDevice(firebaseToken, payLoad, option).then(success => {
  // console.log(success.results[0]['error']);
  // console.log(success.results[1]['error']);
  // console.log(success);
}).catch(err => {
 console.log(err);
})

import 'package:firebase_messaging/firebase_messaging.dart';

class FirebaseCloudMessage {
 static FirebaseCloudMessage _instance = new FirebaseCloudMessage.internal();
 FirebaseCloudMessage.internal();
 factory FirebaseCloudMessage() => _instance;

 final FirebaseMessaging _firebaseMessaging = new FirebaseMessaging();

 configureFirebaseListeners() {
  print('Here');
  _firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
  print("Message $message");
  // return message;
}, onLaunch: (Map<String, dynamic> message) async {
  print("Message $message");
  // return message;
}, onResume: (Map<String, dynamic> message) async {
  print("Message $message");
  // return message;
});
}
}

帮助将不胜感激。谢谢

标签: node.jsflutterpush-notificationfirebase-cloud-messaging

解决方案


这是当前从 firebase 通知服务接收到的通知的默认行为。如果您想在应用程序处于前台时显示通知,则必须手动编写代码。

这是使用flutter_local_notifications包在颤振中显示通知的演示。

注意:这是使用flutter_local_notification包在颤振中显示通知的一个非常基本的示例。您可以配置很多。有关详细说明,请访问此软件包的主页或阅读这篇非常好的媒体文章

第 1 步:在 pubspec.yaml 中安装flutter_local_notifications

第二步:在 initState() 中发起 FlutterLocalNotifications:

@override
  void initState() {
    super.initState();

    var initializationSettingsAndroid =
        new AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        initializationSettingsAndroid, initializationSettingsIOS);

    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }

第 3 步:创建一个函数来处理通知上的点击事件。当用户点击通知时,将调用此函数。

Future<dynamic> onSelectNotification(String payload) async {
    /*Do whatever you want to do on notification click. In this case, I'll show an alert dialog*/
    showDialog(
      context: context,
      builder: (_) => AlertDialog(
        title: Text(payload),
        content: Text("Payload: $payload"),
      ),
    );
  }

第 4 步:编写一个显示通知的函数:

Future<void> _showNotification(
    int notificationId,
    String notificationTitle,
    String notificationContent,
    String payload, {
    String channelId = '1234',
    String channelTitle = 'Android Channel',
    String channelDescription = 'Default Android Channel for notifications',
    Priority notificationPriority = Priority.High,
    Importance notificationImportance = Importance.Max,
  }) async {
    var androidPlatformChannelSpecifics = new AndroidNotificationDetails(
      channelId,
      channelTitle,
      channelDescription,
      playSound: false,
      importance: notificationImportance,
      priority: notificationPriority,
    );
    var iOSPlatformChannelSpecifics =
        new IOSNotificationDetails(presentSound: false);
    var platformChannelSpecifics = new NotificationDetails(
        androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.show(
      notificationId,
      notificationTitle,
      notificationContent,
      platformChannelSpecifics,
      payload: payload,
    );
  }

第 5 步:调用 _showNotification() 函数:

_firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
        //print("Message $message");
        _showNotification(1234, "GET title FROM message OBJECT", "GET description FROM message OBJECT", "GET PAYLOAD FROM message OBJECT");
        return;
    }
}

在此之后,即使您的应用程序在前台,您也可以显示通知。希望这将是有用的。


推荐阅读