Push-уведомления в Perl - PullRequest
       25

Push-уведомления в Perl

2 голосов
/ 12 июня 2019

Я внедряю push-уведомления для сайта, у которого есть серверная часть Perl. Firebase - это служба push-уведомлений, которую я использую. Я потратил немало времени на это и посмотрел несколько руководств и некоторые полезные ресурсы по SO. Я придумал рабочую реализацию только с одной проблемой. Проблема заключается в том, что при отправке push-уведомления оно, кажется, поступает на клиент / браузер как пустое сообщение. То есть никакие данные, содержащие «title» и «body», не могут быть извлечены на стороне клиента / браузера при получении push-уведомления.

Я пытался использовать как firebases, так и старый и новый API, и в любом случае это заканчивалось тем же результатом пустых push-уведомлений, поступающих на клиент / браузер. Я проверил это на Chrome, Firefox и Android, и происходит то же самое.

Вот код perl, который отправляет push-уведомление. Я исключил создание токена на предъявителя, чтобы ограничить объем кода для чтения.

#SEND PUSH NOTIFICATION
my $push_subscriber = <get subscriber details from db>

my $end_point_host = $push_subscriber->{endpoint};  
my $end_point = "https://$end_point_host/v1/projects/<my project 
  id>/messages:send";

my $request = HTTP::Request->new('POST',$end_point);
$request->header('Authorization'=>"Bearer $bearer_token");
$request->header('Content-Type' => 'application/json');

$request->content(JSON::encode_json ({
  message => {
  token => $push_subscriber->{subscription_id},
     notification => {
        title => 'test',
        body => 'test content'          
     },
     webpush => {
        headers => {
           Urgency => 'high'
        },
        notification => {
            body => 'test content',
            requireInteraction => 'true' 
        }
     }
}}));
#send the request           
$ua->request($request));

Вот javascript на стороне клиента / браузера, который вызывается при получении push-уведомления. Это внутри service-worker.js

self.addEventListener('push', function(e) {
    var body;

    if (e.data) {//THE PROBLEM IS HERE. No 'data' object exists
        body = e.data.text();
    } else {
        body = "Empty Message";
    }

    var options = {
        body: body
    };
    e.waitUntil(
        self.registration.showNotification('My Notification', options)
    );
});

Точка, в которой возникает проблема, указана в приведенном выше javascript. Любая помощь / обратная связь будет высоко ценится. Спасибо.

1 Ответ

1 голос
/ 18 июня 2019

В итоге я заработал, просто переписав код подписки на стороне клиента. В моем случае кнопка включения / выключения подписки на значок колокольчика вместе со всем кодом js для его работы.

По сути, с этим руководством я перешел от использования решения googles к конкретному решению для firebase. https://firebase.google.com/docs/cloud-messaging/js/receive

Вам нужно только сохранить 'токен' на вашем сервере, и конечная точка всегда - https://fcm.googleapis.com/v1/projects/YOUR ID / сообщения ПРОЕКТА: отправить

Руководство Firebase содержит пример файла, в котором вы можете подписаться / отписаться на push-уведомления. https://github.com/firebase/quickstart-js/blob/4be200b1c55616535159365b74bfd1fc128c1ebf/messaging/index.html

Как только у меня это заработало, я мог бы сократить его и переписать в простую кнопку уведомления.

По какой-то причине предоставленный firebase-messaging-sw.js из руководства не работал для меня, но с помощью service-worker.js, показанного в моем OP, работал, и поэтому теперь я могу получать push-уведомления вместе с их названием, телом и другие данные.

Вот как я могу сгенерировать токен на предъявителя, использованный в моем примере Perl-кода OP для отправки push-уведомления. Google API OAuth2: ошибка «invalid_grant» при запросе токена для служебной учетной записи в Perl

Надеюсь, это должно охватывать все, что вам нужно знать, если вы хотите делать push-уведомления на сайте с бэкэндом Perl. Надеюсь, это поможет кому-то еще, желающему сделать то же самое.

...