为什么 messaging.getToken() 不能在服务工作进程范围内使用



环境

  • 操作系统版本:MacOS High Sierra 10.13
  • Firebase SDK 版本:4.9.0
  • Firebase 产品:消息传递

问题

根据我在服务工作者范围内调用messaging.getToken()时得到的跟踪,错误的根源在于对window.btoa()的调用,其中显然未定义window。罪魁祸首可以在Firebase SDK的array-buffer-to-base64.ts中的帮助程序函数中找到:

function toBase64(arrayBuffer) {
    const uint8Version = new Uint8Array(arrayBuffer);
    return window.btoa(String.fromCharCode.apply(null, uint8Version));
}

除了诉诸btoa之外,是否有任何技术原因导致messaging.getToken()不能在服务工作者范围内使用?

重现步骤

  1. 确保您在服务工作进程范围内
  2. 使用 firebase.initializeApp() 设置 Firebase
  3. 检索消息传递实例:const messaging = firebase.messaging()
  4. 呼叫messaging.getToken()

经过一番实验,我发现如果我定义以下内容

const btoaCopy = self.btoa; // self is ServiceWorkerGlobalScope
self.window = {
    btoa: (...args) => btoaCopy.call(self, ...args)
};

在调用messaging.getToken()之前,不会抛出任何错误,并且返回的令牌字符串似乎与在客户端中检索到的字符串完全相同。因此,这让我认为这是一个潜在的错误。我将在 GitHub 中报告它以获得反馈。

最新更新