我的网站使用桌面通知,这些通知从未在移动设备上运行过,但我最近开始在Android 4.4上的Chrome版本42.0.2311.108中收到以下异常:
Failed to construct 'Notification': Illegal constructor. Use ServiceWorkerRegistration.showNotification() instead. TypeError: Failed to construct 'Notification': Illegal constructor. Use ServiceWorkerRegistration.showNotification() instead.
我的通知代码很简单,在检查用户是否已授予权限后,我初始化一个新的通知对象,如下所示:
var notification = new Notification(messageOptions.title, { icon: messageOptions.icon });
如何更改此代码以使用ServiceWorkerRegistration.showNotification(显示为undefined
)来支持Chrome移动版本中的通知,或者如果无法进行功能检测并防止异常发生,如果确实不支持[尚]。
在 Chrome 问题跟踪器上查看 crbug.com/481856:
new Notification()
正在弃用的道路上,因为它隐含地假设页面将比通知存活,这在移动设备上不太可能(在桌面上也远不能保证)。因此,我们永远不会在Android上实现它。在弃用期之后,我们有一天也可能在桌面上删除它。
只要可用,网站就应该使用
ServiceWorkerRegistration.showNotification()
(请参阅规范)。我能想到的功能检测
new Notification()
的最佳方法是尝试它(在您获得许可之前)并捕获错误:function isNewNotificationSupported() { if (!window.Notification || !Notification.requestPermission) return false; if (Notification.permission == 'granted') throw new Error('You must only call this *before* calling Notification.requestPermission(), otherwise this feature detect would bug the user with an actual notification!'); try { new Notification(''); } catch (e) { if (e.name == 'TypeError') return false; } return true; }
然后你可以像这样使用它:
if (window.Notification && Notification.permission == 'granted') { // We would only have prompted the user for permission if new // Notification was supported (see below), so assume it is supported. doStuffThatUsesNewNotification(); } else if (isNewNotificationSupported()) { // new Notification is supported, so prompt the user for permission. showOptInUIForNotifications(); }
根据这个:
Note
:尝试使用 Notification() 构造函数在 ServiceWorkerGlobalScope 中创建通知将引发错误。
如果要在服务辅助角色中发送通知,请使用 self.registration.showNotification()
。请参阅 https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/showNotification