环境
- 操作系统版本: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()
不能在服务工作者范围内使用?
重现步骤
- 确保您在服务工作进程范围内
- 使用
firebase.initializeApp()
设置 Firebase - 检索消息传递实例:
const messaging = firebase.messaging()
- 呼叫
messaging.getToken()
经过一番实验,我发现如果我定义以下内容
const btoaCopy = self.btoa; // self is ServiceWorkerGlobalScope
self.window = {
btoa: (...args) => btoaCopy.call(self, ...args)
};
在调用messaging.getToken()
之前,不会抛出任何错误,并且返回的令牌字符串似乎与在客户端中检索到的字符串完全相同。因此,这让我认为这是一个潜在的错误。我将在 GitHub 中报告它以获得反馈。