Todo sobre Apple, Android, Juegos Apks y Sitios de Peliculas

Cómo enviar notificaciones push móviles con PHP y Firebase

de google Mensajería en la nube de Firebase (FCM) es una forma cómoda y gratuita de distribuir notificaciones automáticas a dispositivos móviles. Funciona con iOS, Android y destinos web, eliminando las diferencias entre plataformas. Envías tu carga útil una vez a la API de Firebase y obtienes entrega en tiempo real a todos tus usuarios.

En este artículo, mostraremos cómo usar Firebase para enviar notificaciones automáticas desde el código PHP del lado del servidor. Estamos usando el tercero.

 php-firebase-cloud-messaging 

(PHP-FCM) para simplificar aún más la integración de Firebase.

Delineando la arquitectura

Para enviar correctamente una notificación push se requiere que varios componentes funcionen juntos. Primero necesitas una cuenta activa de Firebase con un proyecto que tenga FCM habilitado. Configuraremos esto en los siguientes pasos. Se le emitirá una clave de servidor que su backend PHP debe incluir con sus solicitudes de Firebase.

También necesitarás una aplicación que utilice el SDK de Firebase para generar un token de registro de cliente. Este token debe enviarse a su servidor PHP. Consérvelo en su base de datos junto con la información que identifica al cliente, como su ID de usuario conectado dentro de su aplicación.

Dado que este artículo se centra en la integración de backend, asumiremos que ya tiene una aplicación cliente de Firebase que se suscribe a notificaciones y recupera un token de registro. Puedes seguir la documentación. para crear una aplicación básica de Android si necesita un proyecto de muestra. Dentro de su código del lado del cliente, envíe el token de Firebase a un punto final API que creará en su servicio PHP.

Una vez que tenga algunos tokens de cliente disponibles en su servidor, puede enviar notificaciones automáticas realizando solicitudes HTTP a la API de FCM. Firebase mediará con las plataformas de entrega de notificaciones individuales y enviará su alerta a los dispositivos especificados. FCM asigna internamente cada token de cliente a la plataforma correcta, como Google Play Services para Android y Apple Push Notification Service (APNS) para iOS.

Creando tu proyecto Firebase

Dirígete al Consola de base de fuego, inicie sesión y haga clic en “Agregar proyecto” para comenzar a configurar su integración. Asigne un nombre a su proyecto y haga clic en las indicaciones de configuración inicial. Haga clic en el engranaje de configuración en la parte superior izquierda cuando llegue al panel. Elija “Configuración del proyecto” en el menú que aparece.

Dirígete a la pestaña “Mensajería en la nube” y anota tu clave de servidor. Su servicio PHP utilizará esta credencial para enviar notificaciones a la API de Firebase.

Debe registrar sus aplicaciones móviles dentro de la consola Firebase. De regreso a la página de inicio, use los botones “Agregar una aplicación” para agregar sus componentes de iOS y Android. Siga el asistente de configuración para proporcionar los datos de su aplicación y descargar su archivo de configuración de Firebase. Se debe hacer referencia a esto cuando inicialice Firebase en su código del lado del cliente.

Si estás creando una aplicación para iOS, debes vincular manualmente tu clave APNS a Firebase. Haga clic en el engranaje de configuración en la parte superior izquierda, elija “Configuración del proyecto” y regrese a “Mensajería en la nube”. Aparecerá una sección de “aplicaciones de Apple” cuando tengas un componente de iOS en tu proyecto. Añadir un clave APNS o certificado de su cuenta de desarrollador de Apple para completar la integración. Esto permite que FCM envíe notificaciones a APNS en su nombre.

Preparando su aplicación PHP

Comience su proyecto PHP agregando la biblioteca PHP-FCM usando Composer:

composer require sngrl/php-firebase-cloud-messaging

Dentro de su código, cree una instancia de la clase Cliente de PHP-FCM:

use sngrlPhpFirebaseCloudMessagingClientClient;

$client = new Client();

$client -> setApiKey("FCM-SERVER-KEY");

$client -> injectGuzzleHttpClient(new GuzzleHttpClient());

Pase al método setApiKey() la clave del servidor que copió desde su consola API de Firebase. En una aplicación real, esto debería almacenarse de forma segura y tratarse como un secreto confidencial.

PHP-FCM se basa en un inyectado Engullir instancia para realizar sus solicitudes HTTP. Guzzle se incluye automáticamente como una dependencia, por lo que no es necesario instalarlo manualmente. Estamos construyendo un nuevo cliente Guzzle en el ejemplo anterior; puedes reutilizar una instancia existente si ya tienes Guzzle en tu aplicación.

La instancia del Cliente FCM ahora está lista para enviar notificaciones a su cuenta FCM.

Registro de tokens de cliente

Las notificaciones se distribuyen a tokens de cliente que representan los dispositivos de sus usuarios. Como se explicó anteriormente, deberá exponer un punto final de API en su aplicación que permita a sus aplicaciones cliente enviar su token FCM después de que el usuario inicie sesión.

A continuación se muestra un ejemplo básico de cómo podría verse esto:

$token = $_POST["fcmToken"];

$userId = ((int) $_POST["userId"]);

/**

* Call a function which persists a user/token

* association to your database

*/

saveUserFcmToken($userId, $token);

Para enviar una notificación push a cada dispositivo registrado, seleccione todos los tokens en su almacén de datos. Puede enviar a un usuario específico recuperando los tokens asociados con su ID. Esto mostraría la notificación en todos los dispositivos en los que iniciaron sesión, que suele ser el comportamiento previsto.

Envío de notificaciones

PHP-FCM abstrae cada entrega de notificación en un objeto Mensaje. Esto incluye una notificación, que contiene el texto que se muestra al usuario, y cualquier opción de entrega que usted proporcione.

Prepare su Notificación primero:

use sngrlPhpFirebaseCloudMessagingClientNotification;

$notification = new Notification(

"Notification Title",

"The longer text of the notification, displayed below the title."

);

Luego cree un Mensaje para representar la entrega de la notificación:

use sngrlPhpFirebaseCloudMessagingClientMessage;

$message = new Message();

$message -> setNotification($notification);

Antes de enviar su mensaje, agregue uno o más destinatarios. El método addRecipient() toma una instancia de Dispositivo; esta clase necesita uno de sus tokens de cliente FCM como parámetro de constructor:

use sngrlPhpFirebaseCloudMessagingClientRecipientDevice;

$message -> addReceipient(new Device("FCM-CLIENT-TOKEN-USER-1"));

$message -> addReceipient(new Device("FCM-CLIENT-TOKEN-USER-2"));

Ahora está listo para enviar el mensaje utilizando el Cliente creado anteriormente:

$client -> send($message);

La notificación se enviará a los dispositivos que haya agregado como destinatarios.

Aquí hay un ejemplo completo que incluye el código de manejo de notificaciones en una función conveniente:

use sngrlPhpFirebaseCloudMessagingClientClient;

use sngrlPhpFirebaseCloudMessagingClientMessage;

use sngrlPhpFirebaseCloudMessagingClientNotification;

use sngrlPhpFirebaseCloudMessagingClientRecipientDevice;

$client = new Client();

$client -> setApiKey("FCM-SERVER-KEY");

$client -> injectGuzzleHttpClient(new GuzzleHttpClient());

function sendNotification(

Client $client,

string $title,

string $body,

string ...$clientTokens) : void {

$message = new Message();

$message -> setNotification(

new Notification(

$title,

$body

)

);

foreach ($clientTokens as $clientToken) {

$message -> addRecipient(new Device($clientToken));

}

$client -> send($message);

}

sendNotification($client, "Hello World", "Test Notification", "FCM-CLIENT-TOKEN-1");

Manejo de datos de respuesta de FCM

El método Client::send() devuelve el objeto de respuesta HTTP para la solicitud de notificación. Puede inspeccionar los datos de respuesta codificados en JSON para determinar si sus notificaciones se entregaron correctamente.

$message = new Message();

$message -> setNotification(new Notification("Test", "Test"));

$message -> addReceipient(new Device("FCM-CLIENT-TOKEN-USER-1"));

$message -> addReceipient(new Device("FCM-CLIENT-TOKEN-USER-2"));

$response = $client -> send($message);

$responseData = $response -> json();

La matriz de datos de respuesta tiene una estructura similar a la siguiente:

{

"success": 1,

"failure": 1,

"results": [

{

"message_id": 100

},

{

"error": "InvalidRegistration"

}

]

}

La matriz de resultados contiene un objeto que representa el estado de entrega de cada uno de los dispositivos a los que intentó enviar. Esto coincidirá con el orden de los destinatarios agregados al Mensaje mediante el método addRecipient(). El JSON de ejemplo anterior indica que solo el primer dispositivo recibió la notificación. La segunda entrega falló, por lo que debes eliminar el token del dispositivo de tu base de datos.

$recipients = [

"FCM-CLIENT-TOKEN-USER-1",

"FCM-CLIENT-TOKEN-USER-2"

];

$message = new Message();

$message -> setNotification(new Notification("Test", "Test"));

foreach ($recipients as $recipient) {

$message -> addReceipient(new Device($recipient));

}

$response = $client -> send($message);

$responseData = $response -> json();

foreach ($responseData["results"] as $i => $result) {

if (isset($result["error"])) {

deleteUserFcmToken($recipients[$i]);

}

}

Agregar datos arbitrarios a las notificaciones

Los mensajes pueden incluir datos arbitrarios que deben comunicarse a la aplicación cliente:

$message = new Message();

$message -> setNotification(

new Notification(

"Breaking News!",

"A breaking news story is available."

)

);

$message -> setData([

"uri" => "/news/latest-stories"

]);

Código del lado del cliente puede acceder a estos datos para tomar diferentes acciones cuando se recibe una notificación.

Establecer prioridades de mensajes

FCM apoya una sistema de prioridad de mensajes que le permite solicitar una entrega inmediata al dispositivo de destino. Cuando se utiliza el modo de alta prioridad, FCM intenta reactivar los dispositivos Android inactivos para manejar la notificación, incluso si se suprime la actividad en segundo plano.

// Indicate a high-priority message

$message -> setPriority("high");

Este atributo debe usarse con cuidado. Enviar demasiados mensajes prioritarios que no resulten en interacciones del usuario hará que sus entregas pierdan prioridad. El mecanismo está destinado a cargas útiles realmente importantes que necesitan superar el ahorro de batería, la aceleración de la red y las restricciones de actividad en segundo plano de un dispositivo.

iOS maneja las prioridades de manera diferente. Recibirás un error si intentas enviar un mensaje de alta prioridad a un dispositivo iOS. Puede utilizar los valores normal o 5; este último indica que se prefiere una entrega de alta prioridad.

Tiempo para vivir

El tiempo de vida (TTL) de una instancia de mensaje determina durante cuánto tiempo sigue siendo relevante. FCM no siempre podrá enviar notificaciones de manera oportuna. El dispositivo objetivo podría estar desconectado o en estado de ahorro de batería. FCM seguirá intentando enviar la notificación, pero este no siempre es un comportamiento deseable. Algunas notificaciones, como los recordatorios de vencimiento, pueden ser irrelevantes para el usuario en el momento en que las recibe.

Utilice el método setTimeToLive() para definir la vida útil de sus mensajes. FCM dejará de intentar entregarlos una vez que haya expirado el TTL.

$message = new Message();

$message -> setNotification(

new Notification(

"Server rotation scheduled for 12pm",

"Cancel within the next 10 minutes."

)

);

$message -> setTimeToLive(600);

Insignias en iOS

iOS usa insignias rojas en los íconos de la pantalla de inicio para indicar la cantidad de notificaciones no leídas disponibles dentro de la aplicación. Puedes cambiar la insignia numérica de tu aplicación con el método setBadge() en un objeto de notificación:

$message = new Message();

$notification = new Notification(

"Server rotation scheduled for 12pm",

"Cancel within the next 10 minutes."

);

$notification -> setBadge(1);

$message -> setNotification($notification);

$message -> setTimeToLive(600);

El Clase de notificación También tiene métodos para otros comportamientos específicos de la plataforma. Puede cambiar el ícono de notificación en dispositivos Android (setIcon()), asignar un sonido para reproducir (setSound()) y usar etiquetas (setTag()) para controlar si las notificaciones anteriores se reemplazan por la nueva entrega. Estas propiedades y las peculiaridades de las implementaciones de su plataforma se describen en la Documentación de la API de FCM.

Conclusión

FCM es una forma ideal de comenzar a enviar notificaciones automáticas a dispositivos móviles desde un backend PHP. Maneja interacciones con implementaciones push específicas de la plataforma, como APNS y Google Play Services, lo que reduce la cantidad de código que necesita escribir.

La biblioteca PHP Firebase Cloud Messaging envuelve la API FCM en clases y métodos PHP convenientes. Para un control más avanzado, puede llamar al API de FCM directamente a través de una biblioteca PHP HTTP como Engullir. Es posible que deba adoptar este enfoque si necesita utilizar opciones de notificación que no están expuestas en PHP-FCM.

Resumen del Contenido