Я пытаюсь реализовать сообщения pu sh. Я следовал учебному пособию, чтобы зарегистрировать работника службы и подписку службы pu sh:
//requesting notification permisison
Notification.requestPermission(status => {
console.log('Notification permission status:', status);
if (status == 'granted') {
if ('serviceWorker' in navigator && 'PushManager' in window) {
console.log('Service Worker and Push is supported');
navigator.serviceWorker.register('/sw.js')
.then(function (registration) {
console.log('ServiceWorker registration successful with scope: ', registration.scope);
})
.catch(function (error) {
console.error('Service Worker Error', error);
});
} else {
console.error('Push messaging is not supported');
}
} else {
console.warn("Notifications denied");
}
});
navigator.serviceWorker.ready.then(function (registration) {
registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(
'<mypublickey>'
)
})
.then(function (subscription) {
//successfull
console.log('push service subscription successfull: ' + JSON.stringify(subscription));
})
.catch(function (e) {
console.error(e);
})
})
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
В консоли браузера я получаю следующую подписку
push service subscription successfull:{
"endpoint":"https://fcm.googleapis.com/fcm/send/id",
"expirationTime":null,
"keys":{
"p256dh":"myp256dh",
"auth":"myauth"
}
}
Затем отправьте свою pu sh, я использую библиотеку web-pu sh php . Вот мой код для отправки пу sh:
<?php
use Minishlink\WebPush\MessageSentReport;
use Minishlink\WebPush\WebPush;
use Minishlink\WebPush\Subscription;
class Test
{
public function execute()
{
$auth = [
'VAPID' => [
'subject' => 'mailto:me@website.com',
'publicKey' => 'mypubkey',
'privateKey' => 'myprivatekey'
]
];
$notifications = [
[
'subscription' => Subscription::Create([
"endpoint" => 'myendpoint',
"keys" => [
'p256dh' => 'myp256dh',
'auth' => 'myauth'
],
]),
'payload' => '{"msg":"hello world!"}'
]
];
$webPush = new WebPush($auth);
$webPush->sendNotification(
$notifications[0]['subscription'],
$notifications[0]['payload']
);
/** @var MessageSentReport $report */
foreach ($webPush->flush() as $report) {
$endpoint = $report->getEndpoint();
if ($report->isSuccess()) {
echo "[v] Message sent successfully for subscription {$endpoint}.";
} else {
echo $report->getReason();
}
}
}
}
И вот что я получаю из этого кода
[v] Message sent successfully for subscription myendpoint.
И это не вызывает никакого уведомления в браузере , Я использую chrome, и 'send test pu sh message' в инструментах разработчика работает и отображает уведомление. Когда я выполняю свой код php для отправки уведомления, в консоли браузера нет никаких журналов. Я также пробовал в Firefox и достиг таких же результатов.
Есть идеи, что может быть не так?
Вот мой работник службы
sw. js
self.addEventListener('push', event => {
console.log('received a push!');
event.waitUntil(
self.registration.showNotification('This is a push');
);
});