如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?
Posted
技术标签:
【中文标题】如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?【英文标题】:How to send push Notification using FCM and Flutter(One to Another Device)? 【发布时间】:2019-10-23 12:06:51 【问题描述】:我在 Flutter 中开发了一对一聊天系统,并希望使用 FCM 将推送通知发送到另一台设备。
我已经设置了所有 Flutter 和 Firebase 消息传递要求。
//In InitState()
_firebaseMessaging.onTokenRefresh.listen(sendTokenToServer);
_firebaseMessaging.getToken();
_firebaseMessaging.configure(onLaunch: (Map<String, dynamic> msg)
print("onLaunch");
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Message(this.user, this.event)),
);
, onResume: (Map<String, dynamic> msg)
print("onResume");
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Message(this.user, this.event)),
);
, onMessage: (Map<String, dynamic> msg)
print("onMessage");
);
_firebaseMessaging.requestNotificationPermissions(
const iosNotificationSettings(sound: true, alert: true, badge: true));
_firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings setting)
print("IOS");
);
//sendTokenToServer() - function send FCM token my Postgres DB
//When user clicks on send Button
Future sendNotification(userData, eventData) async
await Messaging.sendToAll(
title:
"$toBeginningOfSentenceCase(userData['User']['name']) on $toBeginningOfSentenceCase(eventData['Event']['eventName']) event",
body: _messageController.text,
fcmToken: fcmTokenToServer,
);
//Messaging.sendToAll()
static Future<Response> sendToAll(
@required String title,
@required String body,
@required String fcmToken) =>
sendTo(title: title, body: body, fcmToken: fcmToken);
static Future<Response> sendTo(
@required String title,
@required String body,
@required String fcmToken,
) =>
client.post(
'https://fcm.googleapis.com/fcm/send',
body: json.encode(
'notification': 'body': '$body', 'title': '$title',
'priority': 'high',
'data':
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
'id': '1',
'status': 'done',
,
'to': '$fcmToken',
),
headers:
'Content-Type': 'application/json',
'Authorization': 'key=$serverKey',
,
);
但是没有收到推送通知。是不是我必须实现云功能才能发送通知??
【问题讨论】:
我可以使用 FCM 令牌以及主题 ID 将通知从一台设备发送到另一台设备。代码也是一样的。请尝试主题以及可能是令牌错误 @shyju-madathil 你有没有使用firestore来设备存储令牌或服务器上的数据库?? 无服务器...一个设备到另一个设备。在我的应用中,向帖子所有者发送评论通知 你解决了吗? 【参考方案1】:我可以在没有服务器的情况下使用主题/FCM 令牌从一台设备向另一台设备发送 FCM 消息。
注意:在客户端使用服务器密钥是一种不好的做法,不应在生产级应用程序中使用。
static Future<bool> sendFcmMessage(String title, String message) async
try
var url = 'https://fcm.googleapis.com/fcm/send';
var header =
"Content-Type": "application/json",
"Authorization":
"key=your_server_key",
;
var request =
"notification":
"title": title,
"text": message,
"sound": "default",
"color": "#990000",
,
"priority": "high",
"to": "/topics/all",
;
var client = new Client();
var response =
await client.post(url, headers: header, body: json.encode(request));
return true;
catch (e, s)
print(e);
return false;
如果您必须使用 FCM 令牌发送数据请求,请使用
request =
'notification': 'title': title, 'body': message,
'data':
'click_action': 'FLUTTER_NOTIFICATION_CLICK',
'type': 'COMMENT'
,
'to': 'fcmtoken'
;
【讨论】:
如何将其添加到主题/topics/user-userId
将发送到特定设备?
只能用fcmtoken发送,不能用userid的topic
firebaser here 在客户端代码中使用"key=your_server_key"
是一个严重的安全风险,因为它允许恶意用户向您的用户发送他们想要的任何消息。这是一种不好的做法,不应在生产级应用程序中使用。如需更好的方法,请参阅fireship.io/lessons/flutter-push-notifications-fcm-guide 和我的答案:***.com/a/57842615以上是关于如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter - 如何使用 FCM onResume 和 onLaunch 方法?
currentuser 如何在flutter中通过fcm向另一个用户发送请求通知?
如何构造 FCM 推送通知以在 Flutter(Android 和 iOS)的默认系统 Web 浏览器应用中打开指定的 URL