我在向 Edge 发送 Web 推送通知时遇到问题。它在 Chrome、Firefox、Safari 中运行良好,但不适用于 Edge。
我可以在浏览器中获取
endpoint
、auth
和p256dh
并将它们保存到我的数据库中。当我尝试在 python 中使用它们和 pywebpush
库时,我总是收到 HTTP 状态 400 的错误,并且没有正文消息。这使得很难理解问题所在。
我在 Edge 中得到的端点始终是
https://wns2-db5p.notify.windows.com/w
。我不确定这是否正确,因为我在某处读到基于 Chromium 的浏览器都应该返回 https://fcm.googleapis.com/fcm
。有谁知道这是真的吗?
我注意到 Edge 的通知权限对于用户来说有点不同。我不太确定这是否与订阅返回的变量的有效性有关。当我请求许可时,没有弹出窗口,只有浏览器搜索栏末尾(右侧)的一个图标。单击它时,您会看到弹出窗口。
按下允许后,通知似乎已启用并且应该可以工作,因为我得到了我需要的一切。但他们没有。
我想也许事情在本地主机上不起作用,所以我部署了我的应用程序,但它没有帮助。
这就是我得到
endpoint
、auth
和p256dh
的方式:
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array('<my-public-vapid-key>'),
});
const subscriptionAsJson = subscription.toJSON();
const p256dh = subscriptionAsJson.keys?.p256dh;
const auth = subscriptionAsJson.keys?.auth;
const endpoint = subscriptionAsJson.endpoint;
function urlBase64ToUint8Array(base64String: string) {
var padding = '='.repeat((4 - base64String.length % 4) % 4);
var base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
var rawData = window.atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
这也是我用 Python 发送通知的代码:
vapid_claims = settings.VAPID_CLAIMS
parsed_endpoint = urlparse(device.notification_endpoint)
webpush(
subscription_info={
"endpoint": device.notification_endpoint,
"keys": {
"p256dh": device.p256dh,
"auth": device.auth,
}
},
data=data,
vapid_private_key=settings.VAPID_PRIVATE_KEY,
vapid_claims={
"sub": vapid_claims["sub"],
"exp": vapid_claims["exp"],
"aud": f"{parsed_endpoint.scheme}://{parsed_endpoint.netloc}",
},
)
我正在使用 Django,这就是我在
setting.py
中的相关代码的样子:
VAPID_PUBLIC_KEY = os.getenv("VAPID_PUBLIC_KEY")
VAPID_PRIVATE_KEY = os.getenv("VAPID_PRIVATE_KEY")
VAPID_CLAIMS = {
"sub": "mailto:<my-email>",
"exp": 60,
}
我还尝试在不设置声明的情况下发送通知,因为它适用于其他浏览器,但在这种情况下我收到 401 错误。