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



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

相关内容

  • 没有找到相关文章

最新更新