根据我在服务工作者范围内调用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()
const messaging = firebase.messaging()
messaging.getToken()
答案 0 :(得分:0)
经过一些实验,我发现如果我定义以下
const btoaCopy = self.btoa; // self is ServiceWorkerGlobalScope
self.window = {
btoa: (...args) => btoaCopy.call(self, ...args)
};
在调用messaging.getToken()
之前,不会抛出任何错误,返回的令牌字符串似乎与客户端中检索到的字符串完全相同。因此,这让我觉得这是一个潜在的错误。我将在GitHub中报告它以获得反馈。