Работник сервиса не получает сообщение pu sh - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь реализовать сообщения 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');
      );
    });
...