web-dev-qa-db-ja.com

通知の作成に失敗しました:コンストラクターが無効です

私のサイトはモバイルデバイスでは機能しなかったデスクトップ通知を使用していますが、最近Chromeバージョン42.0.23131.108on Android 4.4で次の例外を受け取り始めました:

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

undefinedとして表示されるServiceWorkerRegistration.showNotificationを使用して、モバイルバージョンのChrome)で通知をサポートするようにこのコードを変更するにはどうすればよいですか、それが不可能な場合は機能の検出と、これが実際にサポートされていない場合に例外が発生するのを防ぎます[まだ]。

19
SignalRichard

Chrome Issue Tracker :)の crbug.com/481856 を参照してください。

new Notification()非推奨へのパス上 です。これは、ページが通知よりも長生きすると暗黙的に想定しているためです。これは、モバイルではほとんど発生しません(デスクトップでも保証されているとは言えません)。

したがって、Androidに実装することはありません。非推奨期間の後、いつかデスクトップでも削除する可能性があります。

Webサイトでは、使用可能な場合は常にServiceWorkerRegistration.showNotification()仕様を参照 )を使用する必要があります。

new Notification()を機能検出するために私が考えることができる最善の方法は、それを試して(before権限があります)、エラーをキャッチすることです。 :

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