Comment envoyer des notifications push mobiles avec PHP et Firebase
Agence web » Actualités du digital » Comment envoyer des notifications push mobiles avec PHP et Firebase

Comment envoyer des notifications push mobiles avec PHP et Firebase

Le service Firebase Cloud Messaging (FCM) de Google est un moyen gratuit et pratique de distribuer des notifications push aux appareils mobiles. Il fonctionne avec les cibles iOS, Android et Web, en éliminant les différences entre les plates-formes. Vous envoyez votre charge utile une fois à l’API de Firebase et obtenez une livraison en temps réel à tous vos utilisateurs.

Dans cet article, nous montrerons comment utiliser Firebase pour envoyer des notifications push à partir de votre code PHP côté serveur. Nous utilisons le tiers php-firebase-cloud-messaging (PHP-FCM) pour simplifier davantage l’intégration de Firebase.

Décrivant l’architecture

L’envoi réussi d’une notification push nécessite que plusieurs composants fonctionnent ensemble. Vous avez d’abord besoin d’un compte Firebase actif avec un projet sur lequel FCM est activé. Nous allons configurer cela dans les étapes suivantes. Vous recevrez une clé de serveur que votre backend PHP doit inclure avec ses requêtes Firebase.

Vous aurez également besoin d’une application qui utilise le SDK Firebase pour produire un jeton d’enregistrement client. Ce jeton doit être envoyé à votre backend PHP. Conservez-le dans votre base de données avec les informations identifiant le client, telles que son ID utilisateur connecté dans votre application.

Comme cet article se concentre sur l’intégration backend, nous supposerons que vous avez déjà une application client Firebase qui s’abonne aux notifications et récupère un jeton d’enregistrement. Vous pouvez suivre la documentation pour créer une application Android de base si vous avez besoin d’un exemple de projet. Dans votre code côté client, envoyez le jeton Firebase à un point de terminaison d’API que vous créerez dans votre service PHP.

Une fois que vous avez des jetons client disponibles sur votre serveur, vous pouvez envoyer des notifications push en faisant des requêtes HTTP à l’API FCM. Firebase assurera la médiation avec les plates-formes de diffusion de notifications individuelles, en transmettant votre alerte aux appareils spécifiés. FCM mappe en interne chaque jeton client sur la plate-forme appropriée, telle que Google Play Services pour Android et Apple Push Notification Service (APNS) pour iOS.

Création de votre projet Firebase

image de la page d'accueil de la console Firebase

Rendez-vous sur la console Firebase, connectez-vous et cliquez sur « Ajouter un projet » pour commencer à configurer votre intégration. Donnez un nom à votre projet et cliquez sur les invites de configuration initiales. Cliquez sur le rouage des paramètres en haut à gauche lorsque vous atteignez le tableau de bord. Choisissez « Paramètres du projet » dans le menu qui apparaît.

image de la configuration de FCM dans la console Firebase

Rendez-vous dans l’onglet « Cloud Messaging » et notez votre clé de serveur. Votre service PHP utilisera ces informations d’identification pour envoyer des notifications à l’API Firebase.

image de la page d'accueil de la console Firebase

Vous devez enregistrer vos applications mobiles dans la console Firebase. De retour sur la page d’accueil, utilisez les boutons « Ajouter une application » pour ajouter vos composants iOS et Android. Suivez l’assistant de configuration pour fournir les données de votre application et télécharger son fichier de configuration Firebase. Cela doit être référencé lorsque vous initialisez Firebase dans votre code côté client.

image de la configuration de FCM dans la console Firebase

Si vous créez une application iOS, vous devez lier manuellement votre clé APNS à Firebase. Cliquez sur le rouage des paramètres en haut à gauche, choisissez « Paramètres du projet » et revenez à « Cloud Messaging ». Une section « Applications Apple » apparaîtra lorsque vous avez un composant iOS dans votre projet. Ajoutez une clé ou un certificat APNS à partir de votre compte de développeur Apple pour terminer l’intégration. Cela permet à FCM d’envoyer des notifications à APNS en votre nom.

Préparation de votre application PHP

Commencez votre projet PHP en ajoutant la bibliothèque PHP-FCM à l’aide de Composer :

composer require sngrl/php-firebase-cloud-messaging

Dans votre code, créez une instance de PHP-FCM Client classer:

use sngrlPhpFirebaseCloudMessagingClientClient;
 
$client = new Client();
$client -> setApiKey("FCM-SERVER-KEY");
$client -> injectGuzzleHttpClient(new GuzzleHttpClient());

Passe le setApiKey() méthode la clé de serveur que vous avez copiée à partir de votre console API Firebase. Dans une application réelle, cela doit être stocké en toute sécurité et traité comme un secret confidentiel.

PHP-FCM s’appuie sur une instance Guzzle injectée pour effectuer ses requêtes HTTP. Guzzle est automatiquement inclus en tant que dépendance, vous n’avez donc pas besoin de l’installer manuellement. Nous construisons un nouveau client Guzzle dans l’exemple ci-dessus ; vous pouvez réutiliser une instance existante si vous avez déjà Guzzle dans votre application.

La FCM Client est maintenant prête à envoyer des notifications à votre compte FCM.

Enregistrement des jetons client

Les notifications sont distribuées aux jetons clients qui représentent les appareils de vos utilisateurs. Comme expliqué ci-dessus, vous devrez exposer un point de terminaison d’API dans votre application qui permet à vos applications clientes d’envoyer leur jeton FCM après la connexion de l’utilisateur.

Voici un exemple de base de ce à quoi cela pourrait ressembler :

$token = $_POST["fcmToken"];
$userId = ((int) $_POST["userId"]);
 
/**
 * Call a function which persists a user/token 
 * association to your database
 */
saveUserFcmToken($userId, $token);

Pour envoyer une notification push à chaque appareil enregistré, sélectionnez tous les jetons dans votre magasin de données. Vous pouvez envoyer à un utilisateur spécifique en récupérant les tokens associés à son ID. Cela afficherait la notification sur tous les appareils auxquels ils se sont connectés, ce qui est généralement le comportement prévu.

Envoi de notifications

PHP-FCM résume chaque livraison de notification dans un Message objet. Cela enveloppe un Notification – contenant le texte affiché à l’utilisateur – et toutes les options de livraison que vous fournissez.

Préparer votre Notification première:

use sngrlPhpFirebaseCloudMessagingClientNotification;
 
$notification = new Notification(
    "Notification Title",
    "The longer text of the notification, displayed below the title."
);

Créez ensuite un Message pour représenter la livraison de la notification :

use sngrlPhpFirebaseCloudMessagingClientMessage;
 
$message = new Message();
$message -> setNotification($notification);

Avant d’envoyer votre message, ajoutez un ou plusieurs destinataires. La addRecipient() la méthode prend un Device exemple; cette classe a besoin de l’un de vos jetons client FCM comme paramètre de constructeur :

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

Vous êtes maintenant prêt à envoyer le message en utilisant le Client créé précédemment :

$client -> send($message);

La notification sera envoyée aux appareils que vous avez ajoutés en tant que destinataires.

Voici un exemple complet qui encapsule le code de gestion des notifications dans une fonction pratique :

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");

Traitement des données de réponse FCM

La Client::send() La méthode renvoie l’objet de réponse HTTP pour la demande de notification. Vous pouvez inspecter les données de réponse codées JSON pour déterminer si vos notifications ont été livrées avec succès.

$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();

Le tableau de données de réponse a une structure similaire à la suivante :

{
    "success": 1,
    "failure": 1,
    "results": [
        {
            "message_id": 100
        },
        {
            "error": "InvalidRegistration"
        }
    ]
}

La results array contient un objet représentant l’état de livraison de chacun des appareils auxquels vous avez essayé d’envoyer. Cela correspondra à l’ordre des destinataires ajoutés au Message via le addRecipient() méthode. L’exemple JSON ci-dessus indique que seul le premier appareil a reçu la notification. La deuxième livraison a échoué, vous devez donc supprimer le jeton d’appareil de votre base de données.

$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]);
    }
}

Ajout de données arbitraires aux notifications

Les messages peuvent inclure des données arbitraires qui doivent être communiquées à l’application client :

$message = new Message();
$message -> setNotification(
    new Notification(
        "Breaking News!",
        "A breaking news story is available."
    )
);
$message -> setData([
    "uri" => "/news/latest-stories"
]);

Le code côté client peut accéder à ces données pour effectuer différentes actions lorsqu’une notification est reçue.

Définition des priorités des messages

FCM prend en charge un système de priorité des messages qui vous permet de demander une livraison immédiate à l’appareil cible. Lorsque le mode haute priorité est utilisé, FCM tente de réveiller les appareils Android en veille pour gérer la notification, même si l’activité en arrière-plan est supprimée.

// Indicate a high-priority message
$message -> setPriority("high");

Cet attribut doit être utilisé avec précaution. L’envoi d’un trop grand nombre de messages prioritaires qui n’entraînent pas d’interactions avec l’utilisateur entraînera la dépriorisation de vos diffusions. Le mécanisme est destiné aux charges utiles véritablement importantes qui doivent briser l’économie de batterie d’un appareil, la limitation du réseau et les restrictions d’activité en arrière-plan.

iOS gère les priorités différemment. Vous obtiendrez une erreur si vous essayez d’envoyer un high message prioritaire à un appareil iOS. Vous pouvez utiliser les valeurs normal ou 5ce dernier indiquant qu’une livraison hautement prioritaire est préférée.

Temps de vivre

UN Message La durée de vie (TTL) de l’instance détermine la durée pendant laquelle elle reste pertinente. FCM ne sera pas toujours en mesure de fournir des notifications en temps opportun. L’appareil cible peut être hors ligne ou dans un état d’économie de batterie. FCM continuera d’essayer d’envoyer la notification, mais ce n’est pas toujours un comportement souhaitable. Certaines notifications telles que les rappels d’expiration peuvent ne pas être pertinentes pour l’utilisateur au moment où il les reçoit.

Utilisez le setTimeToLive() méthode pour définir la durée de vie de vos messages. FCM cessera d’essayer de les livrer après l’expiration du TTL.

$message = new Message();
$message -> setNotification(
    new Notification(
        "Server rotation scheduled for 12pm",
        "Cancel within the next 10 minutes."
    )
);
$message -> setTimeToLive(600);

Badges sur iOS

iOS utilise des badges rouges sur les icônes de l’écran d’accueil pour indiquer le nombre de notifications non lues disponibles dans l’application. Vous pouvez changer le badge numérique de votre application avec le setBadge() méthode sur un Notification objet:

$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);

La Notification La classe a également des méthodes pour d’autres comportements spécifiques à la plate-forme. Vous pouvez modifier l’icône de notification sur les appareils Android (setIcon()), attribuez un son à jouer (setSound()), et utilisez des balises (setTag()) pour contrôler si les notifications précédentes sont remplacées par la nouvelle livraison. Ces propriétés et les particularités de leurs implémentations de plate-forme sont décrites dans la documentation de l’API FCM.

Conclusion

FCM est un moyen idéal pour commencer à envoyer des notifications push aux appareils mobiles à partir d’un backend PHP. Il gère les interactions avec les implémentations push spécifiques à la plate-forme telles que APNS et Google Play Services, réduisant ainsi la quantité de code que vous devez écrire.

La bibliothèque PHP Firebase Cloud Messaging encapsule l’API FCM dans des classes et des méthodes PHP pratiques. Pour un contrôle plus avancé, vous pouvez appeler l’API FCM directement via une bibliothèque PHP HTTP telle que Guzzle. Vous devrez peut-être adopter cette approche si vous avez besoin d’utiliser des options de notification qui ne sont pas exposées par PHP-FCM.

★★★★★