【问题标题】:FCM service worker setBackgroundMessageHandlerFCM 服务工作者 setBackgroundMessageHandler
【发布时间】:2017-07-06 10:53:20
【问题描述】:

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

但是当我关闭选项卡时,它应该调用服务人员(在 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);
});

【问题讨论】:

  • 您是否设置了messagingSenderId?因为除此之外,您的代码看起来与我所拥有的相同 - 并且有效。 :-/
  • 你关闭标签了吗?我认为它在标签未关闭且未激活时有效

标签: javascript web firebase firebase-cloud-messaging


【解决方案1】:

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

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

当您的网站标签不在焦点/关闭且浏览器打开时,它应该显示背景通知。

【讨论】:

    【解决方案2】:

    我遇到了这个问题,我在这个链接中找到了解决方案: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 来执行某些操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多