firebase - Perl 中的推送通知
问题描述
我正在为具有 Perl 后端的站点实施推送通知。Firebase 是我正在使用的推送通知服务。我在这方面花了相当多的时间,并查看了一些关于 SO 的指南和一些有用的资源。我提出了一个只有一个问题的有效实施。问题是当发送推送通知时,它似乎作为空消息到达客户端/浏览器。也就是说,当推送通知到达时,在客户端/浏览器端无法检索到包含“标题”和“正文”的数据。
我曾尝试同时使用 Firebase 的旧版和新版 api,但无论哪种方式,最终都会得到相同的结果,即空推送通知到达客户端/浏览器。我已经在 chrome、firefox 和 android 上对此进行了测试,并且发生了同样的事情。
这是发送推送通知的 perl 代码。我已排除生成不记名令牌以限制要读取的代码量。
#SEND PUSH NOTIFICATION
my $push_subscriber = <get subscriber details from db>
my $end_point_host = $push_subscriber->{endpoint};
my $end_point = "https://$end_point_host/v1/projects/<my project
id>/messages:send";
my $request = HTTP::Request->new('POST',$end_point);
$request->header('Authorization'=>"Bearer $bearer_token");
$request->header('Content-Type' => 'application/json');
$request->content(JSON::encode_json ({
message => {
token => $push_subscriber->{subscription_id},
notification => {
title => 'test',
body => 'test content'
},
webpush => {
headers => {
Urgency => 'high'
},
notification => {
body => 'test content',
requireInteraction => 'true'
}
}
}}));
#send the request
$ua->request($request));
这是推送通知到达时调用的客户端/浏览器端 javascript。这是在 service-worker.js 里面
self.addEventListener('push', function(e) {
var body;
if (e.data) {//THE PROBLEM IS HERE. No 'data' object exists
body = e.data.text();
} else {
body = "Empty Message";
}
var options = {
body: body
};
e.waitUntil(
self.registration.showNotification('My Notification', options)
);
});
在上面的 javascript 中指出了问题出现的地方。任何帮助/反馈将不胜感激。谢谢。
解决方案
我最终通过重写我的客户端订阅代码来完成这项工作。在我的情况下,铃铛图标订阅开/关按钮以及所有 js 代码使其工作。
基本上,我通过本指南从使用 google 解决方案转变为特定于 firebase 的解决方案。 https://firebase.google.com/docs/cloud-messaging/js/receive
您只需将“令牌”存储在您的服务器上,并且端点始终是 - https://fcm.googleapis.com/v1/projects/YOUR PROJECT ID/messages:send
firebase 指南包含一个示例文件,您可以在其中订阅/取消订阅推送通知。 https://github.com/firebase/quickstart-js/blob/4be200b1c55616535159365b74bfd1fc128c1ebf/messaging/index.html
一旦我有了这个工作,我就可以把它剪下来,然后把它重新写成一个简单的通知按钮。
由于某种原因,指南中提供的 firebase-messaging-sw.js 对我不起作用,但使用我的 OP 中显示的 service-worker.js 确实如此,所以我现在可以接收推送通知及其标题、正文和其他数据.
这就是我如何生成在我的 OP 示例 perl 代码中使用的不记名令牌以发送推送通知的方式。 Google API OAuth2:使用 Perl 为服务帐户请求令牌时出现“invalid_grant”错误
如果您想在带有 Perl 后端的网站上进行推送通知,那么这应该涵盖您需要知道的所有内容。希望这可以帮助其他想做同样事情的人。
推荐阅读
- formula - 删除电子表格中的两个列条目重复排列
- mongodb - Mongoose 的 on() 方法的文档
- python - 具有重定向输出的 Python 脚本崩溃,输出中没有错误
- javascript - Javascript - 使用 find 获取对象 ID
- angular - 哪些 Angular 2,4 或 5 图表或图形模块最适合表示图表数据
- notepad++ - 如何在记事本++中选择这些IP地址
- python-3.x - 如何通过从另一个脚本调用来运行 Dask Client?
- javascript - 在 React 中进行 dom 操作的最优化方法
- javascript - 需要帮助使用 React.js 制作无意义的记分牌
- excel - Excel - 如何使用一张工作表中的单元格值转到同一工作簿中另一张工作表上的另一个值