如何使用FCM的服务人员推送通知

问题描述:

我想使用服务人员与Firebase在Chrome上实现推送通知。我在我的web应用程序中有一个清单文件和一个sw.js文件。我已经在Firebase中创建了一个项目,并且已经测试了注册和发送通知。这一切都工作正常,但收到通知时数据为空。我不明白为什么,也没有任何有用的资源(据我所知!)。 这里是我的服务人员档案:如何使用FCM的服务人员推送通知

self.addEventListener('push', function(event) { 
    console.log('Push message', event); 
    var title = 'Push message'; 
    event.waitUntil(
    self.registration.showNotification(title, { 
     body: 'The Message', 
     icon: 'images/logo.svg', 
     tag: 'my-tag' 
    })); 
}); 

这是我main.js文件:

if ('serviceWorker' in navigator) { 
    navigator.serviceWorker.register('/sw.js').then(function(registration) { 
    // Registration was successful 
    console.log('ServiceWorker registration successful with scope: ', registration.scope); 
    registration.pushManager.subscribe({ 
     userVisibleOnly: true 
    }).then(function(sub) { 
     console.log('endpoint:', sub.endpoint); 
    }).catch(function(e) { 

    }); 
    }).catch(function(err) { 
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err); 
    }); 
} 

manifest.json的:

{ 
    "name": "APPNAME", 
    "gcm_sender_id": "SENDERID" 
} 

卷曲请求:

curl --header "Authorization: key=APIKEY" -application/json" https://fcm.googleapis.com/fcm/send -d "{\"registration_ids\":[\"REGISTRATIONID\"],\"notification\":{\"title\":\"test\",\"body\":\"testing\"},\"data\":{\"title\":\"erse\"}}" 

推送事件fr的控制台日志om sw.js: enter image description here

我没有收到我在请求中发送的任何数据。这是用firebase做的其他方式吗? 在此先感谢。

+0

[使用GCM推送通知发布数据可能重复](http://*.com/questions/37966954/posting-data-with-gcm-push-notification) – Marco

+0

我也有这个问题 – ihsansat

+0

目前黑客入侵同样的问题。不要认为firebase目前支持我们通过serviceWorkers获得的webPush。 – pascalwhoop

根据this,您可以发送chrome版本为50以上的chrome通知版本的数据。

在Chrome 50之前,推送消息不能包含任何有效负载数据。当你的服务人员发起“推送”事件时,你所知道的只是服务器试图告诉你一些事情,而不是它可能是什么。然后,您必须向服务器发出后续请求,并获取要显示的通知的详细信息,这可能会在网络条件较差的情况下失败。

现在在Chrome 50中(以及在桌面上的Firefox的当前版本中),您可以随推送一起发送一些任意数据,以便客户端可以避免发出额外的请求。但是,拥有巨大的权力会带来很大的责任,所有的有效载荷数据都必须加密。

对于您目前的实现,你可以做这样的事情:

self.addEventListener('push', function(event) { 

var apiPath = '<apiPath>'; 
event.waitUntil(registration.pushManager.getSubscription().then(function (subscription){ 

    return fetch(apiPath).then(function(response){ 
     if(response.status !== 200){ 
      throw new Error(); 
     } 

     return response.json().then(function(data){ 
      var title = data.title; 
      var message = data.body; 
      var icon = data.icon; 
      var tag = data.tag; 
      var url = data.url; 
      return self.registration.showNotification(title,{ 
       body: message, 
       icon: icon, 
       tag: tag, 
       data: url 
      }); 
     }) 
    }).catch(function(err){ 

    }) 

})); 
return; 
}); 

对于可以与特定用户的任何具体的通知,您可以通过工人的注册ID的参数在API网址并获取该特定ID的通知。 希望这有助于!

+0

非常感谢您通知我现在可以使用 – TheSabby

+0

什么是apiPath? –

+0

api path是向您提供通知数据的请求url。 – doubt

根据this tutorial您目前不能将任何数据发送到GCM:

一个缺点,以目前执行的Chrome推送API的是,你不能用推送消息发送任何数据。没有,没有。原因是在将来的实现中,有效载荷数据在发送到推送消息端点之前必须在服务器上进行加密。这样,端点(无论它是否为推送提供者)将无法轻松查看推送消息的内容。这还可以防止其他漏洞,如HTTPS证书验证不良和服务器与推送提供商之间的中间人攻击。但是,此加密功能尚未得到支持,因此在此期间,您需要执行提取以获取填充通知所需的信息。