为什么messaging.getToken()不能在服务工作者范围中使用

时间:2018-01-30 10:09:20

标签: javascript firebase firebase-cloud-messaging

环境

  • 操作系统版本: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()
  3. 设置Firebase
  4. 检索邮件实例:const messaging = firebase.messaging()
  5. 致电messaging.getToken()

1 个答案:

答案 0 :(得分:0)

经过一些实验,我发现如果我定义以下

const btoaCopy = self.btoa; // self is ServiceWorkerGlobalScope

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

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