如何在窗口上下文中接收来自 Firebase 的通知(以及服务工作者)

Posted

技术标签:

【中文标题】如何在窗口上下文中接收来自 Firebase 的通知(以及服务工作者)【英文标题】:How to receive notifications from Firebase in window's context (as well as service worker) 【发布时间】:2020-01-09 14:32:33 【问题描述】:

我在应用程序的公共文件夹中的 firebase-messaging-sw.js 中有一个带有以下内容的反应应用程序:

importScripts('https://www.gstatic.com/firebasejs/6.3.4/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/6.3.4/firebase-messaging.js');

// Initialize the Firebase app in the service worker by passing in the
// messagingSenderId.
firebase.initializeApp(
  'messagingSenderId': '<my-sender-id>'
);

// Retrieve an instance of Firebase Messaging so that it can handle background
// messages.
const messaging = firebase.messaging();

messaging.setBackgroundMessageHandler(function(payload) 
  console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // Do some stuff
);

在我的 index.js 文件中,我有这个:

import * as serviceWorker from './serviceWorker';

if ('serviceWorker' in navigator) 
  navigator.serviceWorker.register('../firebase-messaging-sw.js')
  .then(function(registration) 
    console.log('Registration successful, scope is:', registration.scope);
    console.log( registration);

    Notification.requestPermission().then((permission) => 
      if (permission === 'granted') 
        console.log('Notification permission granted.');
        // TODO(developer): Retrieve an Instance ID token for use with FCM.

       else 
        console.log('Unable to get permission to notify.');
      
    );


  ).catch(function(err) 
    console.log('Service worker registration failed, error:', err);
  );

如果窗口不活动,我可以发布消息并获得通知。到目前为止,一切顺利。

但是,如果窗口处于活动状态,我还需要收到通知。我尝试将此添加到服务人员:

// Handle incoming messages. Called when:
// - a message is received while the app has focus
// - the user clicks on an app notification created by a service worker
//   `messaging.setBackgroundMessageHandler` handler.
messaging.onMessage((payload) => 
  console.log('Message received. ', payload);
  // ...
);

...但我从 firebase 收到此错误: errors.ts:101 Uncaught FirebaseError: Messaging: This method is available in a Window context. (messaging/only-available-in-window).

上面的javascript似乎需要进入index.js文件,以便在窗口上下文中进行处理(我在此看到的所有问题都只是说“onMessage调用需要在前台应用程序中")。

但是我无法访问服务工作者中声明的消息传递变量。

这样做的正确方法是什么?我当然不应该两次初始化 firebase 吗?

【问题讨论】:

【参考方案1】:

只有setBackgroundMessageHandler()-方法必须在 serviceworker 中调用。

您需要在应用程序 UI 的 javascript 文件中使用 onMessage() 处理程序来对有效负载执行进一步操作。

仔细查看docs。

【讨论】:

以上是关于如何在窗口上下文中接收来自 Firebase 的通知(以及服务工作者)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase httpscallable().call() 中接收来自后端的承诺?

如何接收来自 Firebase Analytics 的每日摘要电子邮件?

Win32/64 应用程序是不是可以从 Firebase 接收推送通知消息?

无法在 React.js 中接收来自 Firebase 的消息

接收来自 Firebase 的消息

接收来自两个 Firebase 项目的一个 Android 应用的推送通知