无法构造通知:非法的构造函数

我的网站使用了从未在移动设备上工作过的桌面通知,但最近我开始在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. 

我的通知代码很简单,在检查用户是否授予了权限之后,我按如下方式初始化一个新的Notification对象:

 var notification = new Notification(messageOptions.title, { icon: messageOptions.icon }); 

如何更改此代码以使用undefined的ServiceWorkerRegistration.showNotification来支持Chrome的移动版本中的通知,或者如果无法执行function检测并防止发生exception, t支持[尚]。

Solutions Collecting From Web of "无法构造通知:非法的构造函数"

请参阅Chrome问题跟踪器上的crbug.com/481856 :

new Notification()是在弃用的path ,因为它隐含假定页面将超过通知,这是不太可能在移动(远远不能保证在桌面上)。

因此,我们绝不会在Android上实现它。 我们可能有一天会在桌面上删除它,在弃用期之后。

网站应该使用ServiceWorkerRegistration.showNotification() ( 请参阅规范 )来代替。

我能想到的function检测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(); } 

我自Chrome 42以来也是如此。以下是我的代码:

https://github.com/whiteout-io/mail-html5/blob/master/src/js/util/notification.js#L42