我正在为具有Perl后端的站点实现推送通知。Firebase是我正在使用的推送通知服务。我花了很多时间研究这个问题,并查看了许多关于SO的指南和一些有用的资源。我提出了一个只有一个问题的工作实现。问题是当发送推送通知时,它似乎作为空消息到达客户端/浏览器。也就是说,当推送通知到达时,无法在客户端/浏览器端检索包含"标题"和"正文"的数据。
我尝试使用较旧和较新的 firebase,无论哪种方式,最终都会得到相同的结果,即空推送通知到达客户端/浏览器。我已经在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。这是服务工作者内部.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 代码使其工作。
基本上,我从使用googles解决方案到本指南的Firebase特定解决方案。 https://firebase.google.com/docs/cloud-messaging/js/receive
您只需要将"令牌"存储在服务器上,端点始终是 - https://fcm.googleapis.com/v1/projects/YOUR 项目ID/消息:发送
Firebase 指南包含一个示例文件,您可以在其中订阅/取消订阅推送通知。 https://github.com/firebase/quickstart-js/blob/4be200b1c55616535159365b74bfd1fc128c1ebf/messaging/index.html
一旦我有了这个工作,我就可以把它剪下来,把它重写成一个简单的通知按钮。
出于某种原因,指南中提供的 firebase-messaging-sw.js 对我不起作用,但使用我的 OP 中显示的服务工作者.js所以我现在可以接收推送通知以及他们的标题、正文和其他数据。
这是我如何生成在我的 OP 示例 perl 代码中使用的持有者令牌以发送推送通知。 Google API OAuth2 : 使用 Perl 请求服务帐户令牌时出现"invalid_grant"错误
这应该有望涵盖如果您想在具有Perl后端的站点上进行推送通知,则需要知道的所有内容。希望这能帮助其他人想要做同样的事情。