タイトルがひどいのでごめんなさい。でも残念でした。
Chrome 44 の Notfication.data、 ServiceWorkerRegistration.getNotifications() 追加され、一般的なユースケースの開放 / 簡素化 プッシュ通知を設定できます。
通知データ
Notification.data を使用すると、JavaScript オブジェクトを 通知
要するに、プッシュ メッセージを受信すると、 データを使って通知を作成し、notificationclick イベントで クリックされた通知を取得し、そのデータを取得できます。
例: データ オブジェクトを作成して通知オプションに追加する 次のようになります。
self.addEventListener('push', function(event) {
console.log('Received a push message', event);
var title = 'Yay a message.';
var body = 'We have received a push message.';
var icon = '/images/icon-192x192.png';
var tag = 'simple-push-demo-notification-tag';
var data = {
doge: {
wow: 'such amaze notification data'
}
};
event.waitUntil(
self.registration.showNotification(title, {
body: body,
icon: icon,
tag: tag,
data: data
})
);
});
つまり、notificationclick イベントで情報を取得できます。
self.addEventListener('notificationclick', function(event) {
var doge = event.notification.data.doge;
console.log(doge.wow);
});
以前は、IndexDB にデータを隠したり、末尾に何かを置く必要がありました。 アイコンの URL です。
ServiceWorkerRegistration.getNotifications()
プッシュ通知に取り組むデベロッパーからよく寄せられる要望の一つは、 表示される通知の制御方法が向上します。
ユースケースの例として、ユーザーが複数のスレッドを 受信者に複数の通知が表示されています。ウェブアプリが理想的 まだ読んでいない通知がいくつかあることに 1 つの通知に折りたたみます
getNotifications() を使用しない場合は、前のコードを 最新のメッセージを含む通知が送信されます。getNotifications() を使用すると、 「閉じる」通知がすでに表示されている場合は、 ユーザーエクスペリエンスが大幅に向上します
これを行うためのコードは比較的シンプルです。push イベント内で、 ServiceWorkerRegistration.getNotifications() を使用して、 通知から適切な動作を判断します すべての通知を折りたたむか、Notification.tag を使用します。
function showNotification(title, body, icon, data) {
var notificationOptions = {
body: body,
icon: icon ? icon : 'images/touch/chrome-touch-icon-192x192.png',
tag: 'simple-push-demo-notification',
data: data
};
self.registration.showNotification(title, notificationOptions);
return;
}
self.addEventListener('push', function(event) {
console.log('Received a push message', event);
// Since this is no payload data with the first version
// of Push notifications, here we'll grab some data from
// an API and use it to populate a notification
event.waitUntil(
fetch(API_ENDPOINT).then(function(response) {
if (response.status !== 200) {
console.log('Looks like there was a problem. Status Code: ' +
response.status);
// Throw an error so the promise is rejected and catch() is executed
throw new Error();
}
// Examine the text in the response
return response.json().then(function(data) {
var title = 'You have a new message';
var message = data.message;
var icon = 'images/notification-icon.png';
var notificationTag = 'chat-message';
var notificationFilter = {
tag: notificationTag
};
return self.registration.getNotifications(notificationFilter)
.then(function(notifications) {
if (notifications && notifications.length > 0) {
// Start with one to account for the new notification
// we are adding
var notificationCount = 1;
for (var i = 0; i < notifications.length; i++) {
var existingNotification = notifications[i];
if (existingNotification.data &&
existingNotification.data.notificationCount) {
notificationCount +=
existingNotification.data.notificationCount;
} else {
notificationCount++;
}
existingNotification.close();
}
message = 'You have ' + notificationCount +
' weather updates.';
notificationData.notificationCount = notificationCount;
}
return showNotification(title, message, icon, notificationData);
});
});
}).catch(function(err) {
console.error('Unable to retrieve data', err);
var title = 'An error occurred';
var message = 'We were unable to get the information for this ' +
'push message';
return showNotification(title, message);
})
);
});
self.addEventListener('notificationclick', function(event) {
console.log('On notification click: ', event);
if (Notification.prototype.hasOwnProperty('data')) {
console.log('Using Data');
var url = event.notification.data.url;
event.waitUntil(clients.openWindow(url));
} else {
event.waitUntil(getIdb().get(KEY_VALUE_STORE_NAME,
event.notification.tag).then(function(url) {
// At the moment you cannot open third party URL's, a simple trick
// is to redirect to the desired URL from a URL on your domain
var redirectUrl = '/redirect.html?redirect=' +
url;
return clients.openWindow(redirectUrl);
}));
}
});
このコード スニペットでまず注目すべき点は、 getNotifications() にフィルタ オブジェクトを渡します。つまり、 特定のタグ(この例では できます。
var notificationFilter = {
tag: notificationTag
};
return self.registration.getNotifications(notificationFilter)
次に、表示されている通知を調べて、 その通知に関連付けられた通知数で、 できます。これにより、2 つの通知がある場合に 未読メッセージが 3 件ある場合、3 件の未読メッセージが 新しいプッシュが届くと予測されます。
var notificationCount = 1;
for (var i = 0; i < notifications.length; i++) {
var existingNotification = notifications[i];
if (existingNotification.data && existingNotification.data.notificationCount) {
notificationCount += existingNotification.data.notificationCount;
} else {
notificationCount++;
}
existingNotification.close();
}
重要な点として、通知で close()
を呼び出して、
通知が通知リストから削除されていることを確認。これは
同じタグが使われているため、各通知が次の通知で置き換わります。
使用されます。現時点では、返された配列にこの置換が反映されていません
getNotifications()
~。
これは getNotifications() の一例にすぎません。ご想像のとおり、この API は 他にもさまざまなユースケースが開かれます。
NotificationOptions.vibrate
Chrome 45 では、ファイルの作成時にバイブレーションを 通知を受け取ります。 Vibration API - 現在のみ Chrome for Android - これにより、ユーザーの は、通知が表示されるときに使用されます。
バイブレーション パターンは、数値の配列か、1 つの数値のいずれかです。 1 つの数値の配列として扱われます。配列の値は、トレーニングの ミリ秒、偶数インデックス(0、2、4、...)は振動する時間 奇数インデックスは、次のバイブレーションまでの一時停止時間です。
self.registration.showNotification('Buzz!', {
body: 'Bzzz bzzzz',
vibrate: [300, 100, 400] // Vibrate 300ms, pause 100ms, then vibrate 400ms
});
その他の一般的な機能リクエスト
開発者からよく寄せられる要望の一つは、 一定の期間後に通知を送信する場合や 通知を表示して閉じることを目的にしています。
現時点ではこれを実現する方法がなく 使用できますが、Chrome のエンジニアリング チームではこのユースケースを認識しています。
Android の通知
パソコンでは、次のコードを使用して通知を作成できます。
new Notification('Hello', {body: 'Yay!'});
プラットフォームの制限により、Android ではこれまでサポートされていませんでした。 特に Notification オブジェクトのコールバックは 指定します。ただし、パソコンではウェブの通知を表示するために使用されています。 アプリが表示されます。
触れる唯一の理由は 元々は単純な特徴検出であるため 次のようなコマンドを使用すると、デスクトップをサポートでき、 Android:
if (!'Notification' in window) {
// Notifications aren't supported
return;
}
Chrome for Android ではプッシュ通知が サポートされ Service Worker から作成することはできますが、ウェブページからは作成できません。つまり、 機能の検出は無効になりましたスペースの通知を作成しようとすると、 Chrome for Android に次のエラー メッセージが表示されます。
_Uncaught TypeError: Failed to construct 'Notification': Illegal constructor.
Use ServiceWorkerRegistration.showNotification() instead_
現時点で Android とパソコンで機能検出を行う最善の方法は、 次のとおりです。
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();
}