chromeプッシュ通知を実装している間、サーバーから最新の変更を取得していました。その間、サービスワーカーはメッセージとともに追加の通知を表示しています
このサイトはバックグラウンドで更新されました
すでにここに投稿された提案で試してみました https://disqus.com/home/discussion/html5rocks/Push_notifications_on_the_open_web/
しかし、これまで有用なものは見つかりませんでした。提案はありますか?
通常、GCM(Google Cloud Messaging)からプッシュメッセージを受信したらすぐに、ブラウザーにプッシュ通知を表示する必要があります。これは、ここの3番目のポイントで言及されています。
そのため、GCMからプッシュメッセージを取得しているにもかかわらず、何らかの理由でプッシュ通知をスキップし、「このサイトはバックグラウンドで更新されました」などのデフォルトメッセージを含むプッシュ通知を取得することがあります。
私は同じ問題を経験していましたが、長い調査の後、これはPushイベントとself.registration.showNotification()の間に遅延が発生するためだとわかりました。 self.registration.showNotification()の前にreturnキーワードを見逃した
そのため、通知を取得するには次のコード構造を実装する必要があります。
var APILINK = "https://xxxx.com";
self.addEventListener('Push', function(event) {
event.waitUntil(
fetch(APILINK).then(function(response) {
return response.json().then(function(data) {
console.log(data);
var title = data.title;
var body = data.message;
var icon = data.image;
var tag = 'temp-tag';
var urlOpen = data.URL;
return self.registration.showNotification(title, {
body: body,
icon: icon,
tag: tag
})
});
})
);
});
私は過去にこの問題に遭遇しました。私の経験では、原因は一般に3つの問題のうちの1つです。
userVisibleOnly: true
_オプションを使用してサブスクライブするためです(ただし、これはオプションではなく、設定しないとサブスクリプションが失敗することに注意してください)。event.waitUntil()
を呼び出していません。通知が表示されたままになっているかどうかを確認する前に、Promiseが解決するのを待つ必要があることをブラウザに示すために、Promiseをこの関数に渡す必要があります。event.waitUntil
_に渡されたプロミスを解決しています。 _self.registration.showNotification
_はプロミスおよび非同期であるため、_event.waitUntil
_に渡されたプロミスが解決される前に解決されていることを確認する必要があります。これは機能し、コピー/貼り付け/変更だけです。 「return self.registration.showNotification()」を以下のコードに置き換えます。最初の部分は通知を処理することであり、2番目の部分は通知のクリックを処理することです。しかし、私が何時間もグーグルで答えてくれたことに感謝しない限り、私に感謝しないでください。
しかし、真剣に、すべてのおかげで developers.google.com
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 = 'YOUR_ICON';
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
})
);
});
self.addEventListener('notificationclick', function(event) {
var doge = event.notification.data.doge;
console.log(doge.wow);
});
プッシュ通知イベントの受信時にもっと多くのことが必要な場合、showNotification()
はPromise
を返します。したがって、クラシックチェーンを使用できます。
const itsGonnaBeLegendary = new Promise((resolve, reject) => {
self.registration.showNotification(title, options)
.then(() => {
console.log("other stuff to do");
resolve();
});
});
event.waitUntil(itsGonnaBeLegendary);