28

我的网站使用从未在移动设备上运行过的桌面通知,但我最近开始在 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 });

如何更改此代码以使用出现的 ServiceWorkerRegistration.showNotificationundefined来支持移动版 Chrome 中的通知,或者如果这不可能,则进行功能检测并防止异常发生(如果这确实不是)支持[还]。

4

2 回答 2

26

请参阅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();
}
于 2015-04-28T09:39:44.723 回答
0

据此:_

Note:尝试使用 Notification() 构造函数在 ServiceWorkerGlobalScope 内创建通知将引发错误。

如果要在 Service Worker 中发送通知,请使用self.registration.showNotification(). 请参阅https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/showNotification

于 2022-02-08T05:10:10.360 回答