node.js - 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;
});
}
}
帮助将不胜感激。谢谢
解决方案
这是当前从 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;
}
}
在此之后,即使您的应用程序在前台,您也可以显示通知。希望这将是有用的。
推荐阅读
- firebase - Firestore 的子集合中每秒可以创建多少个文档?
- logging - 如何使用 log4rs 创建自定义过滤器类型?
- excel - 如何将数据分解为单独的文件?
- angular-cli - 如何使用 Windows 身份验证*和 HTTPS* 配置 ng serve 代理
- algorithm - 在一个矩形中分布 N 个点的算法
- javascript - 单击按钮后捕获 API 请求
- c# - 迭代编程 - 更改类方法名称以适合按钮名称
- eclipse - ColdFusion Builder 和 Eclipse 快速差异
- c++ - 在头文件中使用“朋友”和“模板”
- javascript - Docker Compose + Jest - 测试输出未显示在控制台中