FCM服务工作者setBackgroundMessageHandler

时间:2017-02-17 03:47:19

标签: javascript web firebase firebase-cloud-messaging

我尝试过使用FCM(Firebase Cloud Messaging)进行网络推送通知。 当网络应用程序选项卡处于焦点时,我成功收到了一条消息。

但是当我关闭标签时,应该调用服务工作者(在FCM示例中为firebase-messaging-sw.js)。但它根本没有打电话给setBackgroundMessageHandler

const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload) {
  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  const notificationTitle = 'Background Message Title';
  const notificationOptions = {
    body: 'Background Message body.',
    icon: 'firebase-logo.png'
  };

  return self.registration.showNotification(notificationTitle,
      notificationOptions);
});

2 个答案:

答案 0 :(得分:0)

manifest.json文件中包含以下内容: {"gcm_sender_id": "103953800507"}gcm_sender_id对于所有fcm用户都是唯一的,并非特定于您的项目。

在您的服务工作者代码中添加您的项目特定发件人ID。 服务工作者代码的工作示例是here

当您的网站标签未处于焦点/关闭状态且浏览器处于打开状态时,它应显示背景通知。

答案 1 :(得分:0)

我遇到了这个问题,并在以下链接中找到了解决方案:https://github.com/firebase/quickstart-js/issues/71

基本上,问题在于您发送的有效负载。您需要使用“数据”对象来调用setBackgroundMessageHandler(payload)函数。

示例:

{
   "to": "cyn88sDUyZs:APA91bE...",
    "notification": 
    {
       "title": "Title",
       "body": "Body",
       "icon": "https://abs.twimg.com/emoji/v2/72x72/2b50.png",
       "click_action": "https://www.test.com/"
    }
}

这将不会调用setBackgroundMessageHandler(payload)函数,因为它不使用“数据”对象,因此通知对象将使用,其属性将在推送消息上。但是,如果使用“数据”对象,则会调用setBackgroundMessageHandler(payload)函数:

{
   "to": "cyn88sDUyZs:APA91bE...",
   "data":
   {
      "notification": 
      {
         "title": "Title",
         "body": "Body",
         "icon": "https://abs.twimg.com/emoji/v2/72x72/2b50.png",
         "click_action": "https://www.test.com/"
      }
   }
}

因此,在这种情况下,Service Worker将执行函数内部的内容。该函数将有效负载作为参数接收,然后您可以将有效负载属性设置为推送消息,设置另一条消息或调用API来执行某些操作。