La API Web Push le permite enviar notificaciones push a navegadores web y API. Si bien la mayor parte de la lógica tiene lugar en el navegador, aún necesita un componente del lado del servidor para generar sus notificaciones. Aquí está cómo implementar un backend de inserción web usando PHP.
Resumen
Precondiciones
A los efectos de este tutorial, asumiremos que conoce los conceptos básicos de la creación de API HTTP en PHP. Tendrá que exponer algunos puntos de conexión públicos utilizando su infraestructura web. Estos serán llamados por el JavaScript de su navegador para registrar y cancelar el registro de dispositivos.
Este artículo no cubre el código del lado del navegador ni cómo funciona. Deberá configurar un trabajador de servicio que responda a los eventos de inserción entrantes y muestre una notificación al usuario.
En un nivel alto, el flujo de inserción de banda se ve así:
- Se guarda una suscripción push en el navegador. El navegador envía una URL de punto final única a su JavaScript.
- Su JavaScript envía datos de suscripción a su servidor e identifica al usuario al que se aplica.
- Cuando el backend necesite enviar una notificación push, cree una carga útil y envíela a la URL del endpoint reportada como parte de los datos de suscripción.
- El navegador del usuario recibirá la carga útil a través de la plataforma de entrega de notificaciones del proveedor. El trabajador de servicio de JavaScript maneja el evento resultante y utiliza la API de notificaciones del navegador para alertar al usuario.
Aquí se explica cómo implementar los aspectos del lado del servidor de los pasos 1 a 3.
Get configuration
Usaremos el paquete web-push
Packagiste de minishlink. Esto no tiene en cuenta las interacciones con cada plataforma de notificaciones del navegador, por lo que no tiene que distinguir manualmente los tipos de terminales.
Agregue el paquete a su proyecto usando Composer:
composer require minishlink / web-push
Para usar la última versión necesita PHP 7.2 o superior con el gmp
, mbstring
, curl
, y extensiones openssl
. Si debe usar una versión anterior de PHP, bloquee el paquete a una versión anterior para mantener la compatibilidad.
La biblioteca expone una clase kernel WebPush
con métodos que le permiten enviar notificaciones de forma individual o por lotes. Las suscripciones están representadas por instancias de la clasificación Subscription
.
Proporcionar claves insulsas
La confianza en el ecosistema web push que cumple con los estándares se ve reforzada por el uso de claves insulsas. Su servidor necesita un par de claves INSÍPIDO para poder autenticarse con los navegadores. La clave pública debe exponerse a través de un punto final de API.
puede generar un INSULSO anillo de claves utilizando el web-push
envuelva:
use MinishlinkWebPushVAPID; $ keyset = VAPID::createVapidKeys(); // public key - this needs to be accessible via an API endpointthrew out $ keyset; // private key - never expose this!threw out $ keyset; File_put_contents("vapid.json", json_encode($ keyset));
Generar las claves de su sistema y almacenarlos en una ubicación persistente. Agregue un punto final de API para que su JavaScript del lado del cliente pueda recuperar la clave pública. Esto se utilizará para configurar la suscripción push del navegador. El dispositivo del usuario aceptará eventos push entrantes si se han firmado con la clave privada VAPID correspondiente.
Registro de suscripciones push
El siguiente paso en la secuencia es recibir solicitudes de suscripción push de sus clientes. Después de que el navegador confirme una nueva suscripción push, su JavaScript debe enviar la URL del punto de conexión de suscripción y las claves de autenticación asociadas al servidor. Almacene estos detalles con el ID de usuario para poder recuperar más adelante cualquier dispositivo inscrito en push vinculado al usuario.
Omitimos los ejemplos de código para este paso porque la implementación depende de su capa de almacenamiento de datos y los valores enviados por su JavaScript. Normalmente se trata de una representación JSON de un objeto PushSubscription
. Necesita un conjunto sencillo de terminales de API CRUD basadas en bases de datos para crear una suscripción, reemplazar una suscripción existente y solicitar la eliminación cuando el usuario se da de baja.
Preparación de suscripciones
Una vez que un cliente se haya registrado correctamente, puede comenzar a enviar notificaciones utilizando la biblioteca web-push
. Comience por crear una instancia de la WebPush
para clasificar:
use MinishlinkWebPushWebPush; $ webPush = new WebPush(]);
Usted puede reutilizar una WebPush
instancia cada vez que se envíe una notificación. La biblioteca debe configurarse con el llavero INSÍPIDO que generaste anteriormente. Las claves deben estar codificadas en Base64, pero esto se maneja por usted si las crea con la biblioteca.
VAPID subject
se utiliza para identificar su servidor y sus datos de contacto. Puede proporcionar una URL de sitio web o un enlace de dirección de correo electrónico mailto:
.
A continuación, debe obtener la suscripción push a la que va a enviar. Utilice su sistema de acceso a datos para encontrar las direcciones URL de punto final push asociadas con el usuario al que desea enviar. Convierta cada suscripción en un ejemplo Subscription
:
use MinishlinkWebPushSubscription; // Get user's push data ...// SELECT * FROM push_subscriptions WHERE user_id = 123456 $ subscription = Subscription::create(]);
El auth
propiedad de la PushSubscription
se repite dos veces para lidiar con dos versiones diferentes de la especificación de navegador utiliza los servicios. La propiedad P256DH es otra clave pública que debe proporcionarse cuando se establece en la suscripción.
El web-push
La biblioteca es compatible con terminales push de Chrome y Firefox. También funcionará con cualquier otra implementación de web push que cumpla con el estándar actual.
Envío de una notificación
Ahora combinar su WebPush
et Subscription
instancias para enviar una notificación de:
$ result = $ webPush -> sendOneNotification( $ subscription, json_encode());
Appel sendOneNotification()
ofrece entrega inmediata por una sola notificación. La carga útil en este caso es una matriz codificada en JSON con dos propiedades. Depende de usted qué datos envía y qué formato utiliza: su cliente de JavaScript los recibe tal cual y puede interpretarlos según sea necesario.
El envío de una notificación devuelve una clase de resultado que le permite verificar si la operación se realizó correctamente:
if ($ result -> isSuccess()) { // all good}else { // something went wrong error_log($ result -> getReason()); // provides raw HTTP response data error_log($ result -> getResponse()); }
Puede tomar medidas para reintentar o cancelar la entrega si se produce un error.
Las suscripciones a notificaciones también pueden caducar. Llame a isSubscriptionExpired()
en una clase result para determinar si esta es la razón del error. En este caso, puede eliminar la suscripción de la base de datos, asegurándose de no enviar nada más a un punto final muerto.
Lote de notificaciones
Notificaciones pueden ser agrupados juntos para ser entregados con una sola llamada al método:
$ webPush -> queueNotification($ subscription, );$ webPush -> queueNotification($ subscription, ); foreach ($ webPush -> flush() as $i => $ result) { threw out ("Notification $i was " . ($ result -> isSuccess() ? "feels" : "not sent"));}
Esto es útil cuando usted sabe que usted va a enviar un gran número de notificaciones en un corto período de tiempo. Ponga en cola todas sus cargas útiles y deje que web-push
las entregue de manera óptima.
Puede limitar el número de notificaciones enviadas en una flush()
pasando un entero al método:
$ webPush -> flush(100); // send 100 messages
El valor predeterminado es 1000
.
Opciones de notificación
sendOneNotification()
et queueNotification()
acepte las siguientes opciones como tercer argumento de la matriz:
-
TTL
– Controla durante cuánto tiempo la plataforma de notificaciones del navegador mantendrá la notificación si no se puede entregar al dispositivo del usuario de inmediato. Si el dispositivo del usuario está desconectado, las plataformas intentarán entregarlo por defecto durante las próximas cuatro semanas. Si envías una notificación que no será relevante la próxima semana, ajusta la edad en consecuencia para que el usuario no vea contenido obsoleto. -
urgency
– Aceptenormal
,low
ouvery-low
como valores. Algunas plataformas pueden usarlo para ajustar la frecuencia de entrega de notificaciones. Los dispositivos que entran en el modo de ahorro de batería pueden suspender la entrega de notificaciones no urgentes. -
batchSize
– Esto tiene el mismo efecto que el argumento deflush()
descrito anteriormente.
Puede configurar los valores de opción predeterminados utilizando el segundo argumento del fabricante WebPush
:
$ webPush = new WebPush(], );
Resumen
El web-push
La biblioteca hace que sea fácil para enviar notificaciones push usando PHP. Se obtiene una capa de abstracción en la parte superior de las diferentes plataformas del navegador que admite el procesamiento por lotes, el manejo de errores y toda la funcionalidad de inserción web.
El mecanismo de inserción web es un sistema de navegador inusual porque se basa en componentes remotos del lado del servidor que usted mismo proporciona. Esto puede hacer que parezca opaco y técnico. En la práctica, crear un backend PHP simple es rápido y fácil; la implementación de front-end suele ser el aspecto que consume más tiempo, especialmente si aún no está utilizando las funciones de service worker.