Как отправить push-уведомление в веб-браузер?


Я читал в течение последних нескольких часов о Push Notification API и API веб-уведомлений. Я также обнаружил, что Google и Apple предоставляют услугу push-уведомлений бесплатно через GCM и APNS соответственно.

Я пытаюсь понять, можем ли мы реализовать push-уведомление для браузеров с помощью Desktop Notification, что, по моему мнению, делает API веб-уведомлений. Я видел документацию google о том, как это можно сделать для Chrome здесь & здесь.

теперь я все еще не могу понять:

  1. можем ли мы использовать GCM/APNS для отправки push-уведомлений во все веб-браузеры, включая Firefox и Safari?
  2. если не через GCM можем ли мы иметь свой собственный бэк-энд, чтобы сделать то же самое?

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

9 123

9 ответов:

Так вот я отвечаю на свой собственный вопрос. У меня есть ответы на все мои запросы от людей, которые в прошлом создавали службы push notification services.

Обновление (Май 2018): здесь всеобъемлющий и очень хорошо написанный документ о веб-push-уведомлении от Google.

ответ на оригинальные вопросы, заданные 3 года назад:

  1. можем ли мы использовать GCM / APNS для отправки push-уведомлений на все веб-сайты Броузеры в том числе Firefox и Safari?

ответ: Google устарел GCM по состоянию на апрель 2018 года. Теперь вы можете использовать Облако Опорного Пункта Обмена Сообщениями (FCM). Это поддерживает все платформы, включая веб-браузеры.

  1. если не через GCM можем ли мы иметь свой собственный бэк-энд, чтобы сделать то же самое?

ответ: да, push-уведомление может быть отправлено из нашего собственного бэк-энда. Поддержка то же самое произошло со всеми основными браузерами.

Регистрация этот codelab из Google, чтобы лучше понять реализацию.

реализация собственного бэкэнда на различных языках программирования.:

Дополнительные Материалы:

есть ли бесплатные услуги, чтобы сделать то же самое? Есть некоторые компании, которые предоставляют аналогичное решение в бесплатных, freemium и платных моделях. Я перечисляю несколько ниже:

  1. https://onesignal.com/ (бесплатно / поддержка всех платформ)
  2. https://firebase.google.com/products/cloud-messaging/ (бесплатно)
  3. https://clevertap.com/ (имеет свободный план)
  4. https://goroost.com/

Примечание: При выборе бесплатного сервиса не забудьте прочитать TOS. Бесплатные услуги часто работают путем сбора пользовательских данных для различные цели, включая аналитику.

кроме того, вам нужно иметь HTTPS для отправки push-уведомлений. Однако вы можете получить https свободно через letsencrypt.org

Хавьер охватил уведомления и текущие ограничения.

мое предложение: window.postMessage пока мы ждем, пока браузер для инвалидов догонит, else Worker.postMessage() чтобы по-прежнему работать с веб-работниками.

это может быть резервный вариант с обработчиком отображения сообщений диалогового окна, когда тест функции уведомления не выполняется или разрешение отклонено.

уведомление имеет-функция и отказано-проверка разрешения:

if (!("Notification" in window) || (Notification.permission === "denied") ) {
    // use (window||Worker).postMessage() fallback ...
}

GCM / APNS предназначены только для Chrome и Safari соответственно.

Я думаю, что вы можете искать Notification:

https://developer.mozilla.org/en-US/docs/Web/API/notification

он работает в Chrome, Firefox, Opera и Safari.

Я предполагаю, что вы говорите о real push-уведомления, которые могут быть доставлены, даже если пользователь не просматривает ваш сайт (в противном случае проверьте WebSockets или устаревшие методы, такие как длинный опрос).

можем ли мы использовать GCM/APNS для отправки push-уведомлений во все веб-браузеры, включая Firefox и Safari?

GCM только для Chrome и APNs только для Safari. Каждый производитель браузеров предлагает свой собственный сервис.

Если не через GCM можем ли мы иметь свой собственный бэк-энд, чтобы сделать то же самое?

Push API требует два бекенда! Один из них предлагается производителем браузера и отвечает за доставку уведомления на устройство. Другой должен быть вашим (или вы можете использовать сторонний сервис, например Pushpad) и несет ответственность за запуск уведомления и обращение в службу производителя браузера (т. е. GCM, APNs, Mozilla push серверы).

раскрытие информации: я основатель Pushpad

вы можете передавать данные с сервера в браузер через События На Стороне Сервера. Это по существу однонаправленный поток, на который клиент может "подписаться" из браузера. Отсюда вы можете просто создать новый Notification объекты в виде потока SSEs в браузер:

var source = new EventSource('/events');

source.on('message', message => {
  var notification = new Notification(message.title, {
    body: message.body
  });
}); 

немного старый, но в этой статье от Eric Bidelman объясняет основы SSE и предоставляет некоторые примеры кода сервера, а также.

могу ли я переопределить ваш вопрос, как показано ниже

можем ли мы иметь собственный сервер для отправки push-уведомлений в Chrome, Firefox, Opera и Safari?

да. К сегодняшнему дню (2017/05), вы можете использовать ту же реализацию на стороне клиента и сервера для обработки Chrome, Firefox и Opera (без Safari). Потому что они реализовали веб-уведомления толчка таким же образом. То есть Push API протокол консорциумом W3C. Но сафари у них собственная старая архитектура. Поэтому мы должны поддерживать Safari отдельно.

см. браузер-push РЕПО для направляющих линий для реализации веб-уведомления толчка для вашего веб-приложения с вашим собственным фоном. Это объясняет с примерами, как вы можете добавить поддержку веб-уведомления толчка для вашего веб-приложения без каких-либо сторонних услуг.

На данный момент GCM работает только для chrome и android. аналогично firefox и другие браузеры имеют свой собственный api.

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

  1. вам нужен код сценария на стороне клиента, т. е. работник службы, см. ( Google push notification). Хотя это остается таким же для других браузеров.

2.после получения конечной точки с помощью Ajax save вместе с именем browser.

3.Вам нужно создать серверную часть, которая имеет поля для заголовка, сообщения, значка, нажмите URL в соответствии с вашими требованиями. теперь после нажатия на кнопку отправить уведомление, вызовите функцию say send_push (). В этом коде пишем для разных браузеров например

3.1. для chrome

 $headers = array(
          'Authorization: key='.$api_key(your gcm key),
          'Content-Type: application/json',
     );
   $msg = array('to'=>'register id saved to your server');
   $url = 'https://android.googleapis.com/gcm/send';
   $ch = curl_init();

      // Set the url, number of POST vars, POST data
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($msg));

      $result = curl_exec($ch);

3.2. для mozilla

$headers = array(            
              'Content-Type: application/json',
              'TTL':6000
            );

       $url = 'https://updates.push.services.mozilla.com/wpush/v1/REGISTER_ID_TO SEND NOTIFICATION_ON';

      $ch = curl_init();

      // Set the url, number of POST vars, POST data
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);


      $result = curl_exec($ch);

для других браузеров, пожалуйста, google...

Я предлагаю использовать pubnub. Я попытался использовать ServiceWorkers и PushNotification из браузера, однако, когда я попробовал это webviews не поддерживал это.

https://www.pubnub.com/docs/web-javascript/pubnub-javascript-sdk

Это простой способ сделать push-уведомление для всех браузеров https://pushjs.org

Push.create("Hello world!", {
body: "How's it hangin'?",
icon: '/icon.png',
timeout: 4000,
onClick: function () {
    window.focus();
    this.close();
}

});