9

Мой сайт использует оповещения на рабочем столе, которые никогда не работали на мобильных устройствах, но я недавно начал получать следующее исключение в Chrome версии 42.0.2311.108 на Android 4.4:Не удалось построить Уведомление: Illegal конструктор

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, или если это невозможно, выполните обнаружение функции и предотвратите исключения, если это действительно не поддерживается [пока].

+1

Я просто положить это вместе, делает эту работу для тебя? http://jsbin.com/rexede/latest/quiet/ –

+0

Такое же сообщение об ошибке для вашего примера. Прекрасно работает на рабочем столе, но не работает на Android. Chrome 42.0.2311.109 на Android 5.1.0; Nexus 5 Build/LMY47I – user1397423

ответ

4

См crbug.com/481856 на вопрос трекера Chrome:

new Notification() is on the path to deprecation , because it implicitly assumes that the page will outlive the notification, which is very unlikely on mobile (and far from guaranteed on desktop too).

Hence we will never implement it on Android. We might one day remove it on desktop too, after a deprecation period.

Websites should use ServiceWorkerRegistration.showNotification() (see spec) instead whenever it is available.

The best way I can think of to feature-detect new Notification() is to try it (before you have permission) and catch the error:

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; 
} 

You could then use it like this:

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(); 
}