我的代码在本地和 Chrome 生产环境中运行良好。
这是我在用户想要启用通知时在浏览器中运行的
Subscribe()
函数(我没有使用 Apple 的 APN 服务,而是标准 PushAPI)。
export function Subscribe(vapid: string): Promise<PushSubscription> {
return new Promise((resolve, reject) => {
if (!vapid) {
reject("VAPID not declared")
}
navigator.serviceWorker.getRegistration()
.then((registration) => {
if (!registration) {
return
}
registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(vapid),
}).then((subscription) => {
console.log(subscription)
if (!subscription) {
reject(new Error("Unable to subscribe (empty subscription)"))
}
if (subscription.endpoint === "") {
reject(new Error("Unable to subscribe (empty endpoint)"))
}
resolve(subscription)
})
})
.catch((err) => {
reject(err)
});
})
}
浏览器请求用户的许可,没有问题,然后当尝试订阅时,我得到的有效负载是这样的:
PushSubscription {endpoint: "", expirationTime: null, options: PushSubscriptionOptions, getKey: function, unsubscribe: function, …}
字符串化:
{
"keys":{
"p256dh":"",
"auth":""
}
}
如您所见,没有错误,但端点和键都是空的。
~/Library/Safari/RemoteNotifications/Permissions.plist
),但我认为它使用了不同的API并且这些不是服务器端推送的通知。{
"endpoint":"",
"publicKey":"",
"authSecret":""
}
我的系统看起来像是一个奇怪的问题,但无法找出问题所在。
我要补充一点,这台机器是在企业管理下的,但他们说他们没有阻止推送通知的策略。
感谢@collimarco,这确实是一个 Safari 错误。 升级到 Safari beta(当时无法升级到 Sequoia)解决了这个问题。