Flutter 推送通知仅在应用程序处于后台时才有效 [英] Flutter push notification is working only when app is in background

查看:42
本文介绍了Flutter 推送通知仅在应用程序处于后台时才有效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

My problem is regarding the push notification using Flutter and firebase_messaging plugin

问题:

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

I have integrated firebase_messaging plugin to my flutter app for push notification. I can guarantee that the setup is correct to the best of my knowledge as i am receiving push notification. The problem occurs when pushes are received only when my app is running in the background(like minimizing but available in the system memory). Pushes are not received when app is in foreground or is killed.

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

To provide a solution on what I have tried, I could not figure out actually needs to be done.

我遵循了这方面的教程,并应用了每一步来解决问题,但无济于事.

I have followed tutorials on this and applied every single step to overcome the problem but to no avail.

我使用 nodeJS 来处理 firebase-admin 和 serviceaccountkey 文件,因为我需要从我的数据库中获取 device_tokens.

I am using nodeJS to handle the firebase-admin and serviceaccountkey file as I need device_tokens from my DB.

NodeJS

 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;
});
}
}

帮助将不胜感激.谢谢

推荐答案

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

This is the default behavior of notifications received from the firebase notification service currently. You have to manually write code if you wanna show the notification when your app is in the foreground.

这是使用 flutter_local_notifications 包在 Flutter 中显示通知的演示.

Here's a demo of showing notification in flutter using flutter_local_notifications package.

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

NOTE: This is a really basic example of showing notifications in flutter using flutter_local_notification package. There's a lot you can configure. For a detailed explanation, visit homepage of this package or read this really good medium article

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

Step 1: install flutter_local_notifications package in your pubspec.yaml

第 2 步:在 initState() 中启动 FlutterLocalNotifications:

Step 2: initiate FlutterLocalNotifications in initState():

@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 步:创建一个函数来处理通知上的点击事件.当用户点击通知时将调用此函数.

Step 3: Create a function to handle click events on the notification. This function will be called when a user will tap on the notification.

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 步:编写一个函数来显示通知:

Step 4: Write a function to show notification:

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() 函数:

Step 5: Call the _showNotification() function:

_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;
    }
}

此后,即使您的应用程序在前台,您也可以显示通知.希望这会有所帮助.

After this, you will be able to show notification even when your app is in the foreground. Hopefully, this will be useful.

这篇关于Flutter 推送通知仅在应用程序处于后台时才有效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆