我的网站使用的桌面通知从未在移动设备上运行,但我最近在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中的通知,或者如果无法执行功能检测并阻止例外情况发生的事情如果真的不支持[还]。
答案 0 :(得分:8)
请参阅Chrome问题跟踪器上的crbug.com/481856:
new Notification()
是on the path to deprecation,因为它隐含地假设该页面会比通知更长,这在移动设备上是不太可能的(并且远远不能在桌面上得到保证)。因此我们永远不会在Android上实现它。在弃用期过后,我们可能有一天会在桌面上删除它。
网站应尽可能使用
ServiceWorkerRegistration.showNotification()
(see spec)。我能想到的功能检测
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(); }