无法订阅推送通知
Posted
技术标签:
【中文标题】无法订阅推送通知【英文标题】:Can't subscribe to Push notification 【发布时间】:2016-12-26 17:10:22 【问题描述】:我正在尝试订阅 PushManager 以发送推送通知,但调用 subscribe 时总是出错。
这是我的订阅电话
registration.pushManager.subscribe( userVisibleOnly: true )
.then(function (subscription) /* ... */)
.catch(function (err) /* ... */)
如您所见,没有什么奇怪的,而且那个调用总是抛出
DOMException: 注册失败 - 推送服务错误
我不知道为什么会这样。 到目前为止我检查过的内容
我的manifest.json
中有一个gcm_sender_id
属性。
在客户端授予通知权限。
registration.pushManager.getSubscription()
总是得到null
并且订阅总是抛出上述错误。
我还应该看什么?欢迎任何成功订阅推送通知的帮助,顺便说一下,我使用的是 chrome 55,如果您需要更多信息,请告诉我。
编辑:registerServiceWorker
函数上的所有注册码都是here。
谢谢。
【问题讨论】:
【参考方案1】:假设您已经正确注册了 service worker,使用类似:
navigator.serviceWorker.register('/serviceworker.js',
scope: '/'
);
我建议您像我一样为您的 Service Worker 使用相对路径,而不是像您在代码中那样使用 window.location.origin,并且最好将 serviceworker 文件保存在根。
使用此方法订阅推送并获取端点。
navigator.serviceWorker.ready
.then(function(serviceWorkerRegistration)
return serviceWorkerRegistration.pushManager.subscribe(
userVisibleOnly: true
);
)
.then(function(subscription) console.log(subscription.endpoint););
如果还是不行: - 尝试从 chrome://serviceworker-internals 注销现有工作人员,并确保在执行此操作时关闭所有选项卡。
如果还是不行: -尝试通过单击 chrome 右上角的名称来创建新的 chrome 配置文件。 (我遇到过一次)
检查this 代码以供参考。
【讨论】:
我使用了window.location.origin
,因为当有人导航到另一条路线时,我收到了找不到服务人员的错误,也许scope
选项可以解决这个问题。其余代码等价于你的答案
经过一番搜索,我找到了解决方案。我在manifest.json
文件中使用了错误的gcm_sender_id
。我在谷歌开发者控制台中使用了项目ID,当我changed it by the project number时,它工作了!
:) 对你有好处!但这不应该是问题。仅当您触发推送而不是订阅时,您才会遇到 gcm_sender_id 不正确的问题。我猜根范围对你有用! :)
我不这么认为,因为我还没有做出改变。并且只有在发送推送时使用的 gcm 密钥是在服务器中注册的 gcm api 密钥,与清单的 id 不同。实际上,如果您尝试在清单中没有 gcm_sender_id 属性的情况下进行订阅,则会引发不同的错误【参考方案2】:
我想提一下在使用 FCM 推送服务订阅浏览器/网络推送用户时发生在我身上的与 DOMException 相关的事情,也就是说,订阅就像魔术一样工作,但是当我测试我的应用程序时,我遇到了 FCM 推送服务/服务器很多。这导致了一个 TOO_MANY_REGISTRATIONS 错误,可以通过chrome://gcm-internals 进行检查。该解决方案非常合乎逻辑,只需在 chrome 上创建一个新的配置文件/用户。
FCM 拒绝了以前 chrome 用户的任何注册请求,我相信 FCM 将其视为垃圾邮件或有人入侵了他们的服务器。感谢@Dhruv Batheja 让我注意到这一点。
【讨论】:
:) - - - - - -(:以上是关于无法订阅推送通知的主要内容,如果未能解决你的问题,请参考以下文章
MobileFirst - Android 推送 - 无法订阅,通知令牌未在服务器上更新
Google Drive API 推送通知订阅 400“解析错误”