首页 > 解决方案 > 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 中指出了问题出现的地方。任何帮助/反馈将不胜感激。谢谢。

标签: firebaseperlpush-notificationfirebase-cloud-messaging

解决方案


我最终通过重写我的客户端订阅代码来完成这项工作。在我的情况下,铃铛图标订阅开/关按钮以及所有 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 后端的网站上进行推送通知,那么这应该涵盖您需要知道的所有内容。希望这可以帮助其他想做同样事情的人。


推荐阅读