Firebase FCM Push Notification Backend

Mit Firebase Cloud Messaging, kurz FCM, kann man Notifications auf IOS und Android versenden. Im folgenden Beitrag geht es um das Versenden der Nachrichten im Backend mit PHP. Um mit PHP Nachrichten an FCM zu schicken kann die Library

“paragraph1/php-fcm”: “^0.7.0”

verwendet werden. Damit man Daten aus der Firebase Database verwenden kann, verwendet man zusätzlich noch die Library:

“kreait/firebase-php”: “^2.0”,

Damit ergibt sich das folgende composer File:

{
“require”: {
“kreait/firebase-php”: “^2.0”,
“paragraph1/php-fcm”: “^0.7.0”
}
}

Um mit Firebase zu arbeiten erstellen wir eine backend.php Datei:

<?php
require ‘vendor/autoload.php’;

use paragraph1\phpFCM\Client;
use paragraph1\phpFCM\Message;
use paragraph1\phpFCM\Recipient\Device;
use paragraph1\phpFCM\Recipient\Topic;
use paragraph1\phpFCM\Notification;

$firebase = Firebase::fromServiceAccount(__DIR__.’/secret/firebaseappname-firebase-adminsdk-uuid.json’);
$apiKey = ‘ffcmApiKey-findetmanunterProjekteinstellungenCloudMessaging’;
$client = new Client();
$client->setApiKey($apiKey);
$client->injectHttpClient(new \GuzzleHttp\Client());

Mit der Variable $firebase kann nun auf die Datenbank zugegriffen werden und mit $client können Nachrichten versendet werden. Die json Datei und den apiKey findet man in der https://console.firebase.google.com/. Dort unter Deine App >> Projekteinstellungen >> Cloud Messaging ist der API Key und unter Deine App >> Projekteinstellungen >> Dienstkonten kann man sich einen privaten Schlüssel generieren lassen. Diesen dann entweder im gleichen Ordner wie die backend.php ablegen oder wie im Beispiel im Ordner secret. Wichtig ist das die Datei keinen entsprechende Zugriffsrechte hat, damit niemand diese über den Webserver auslesen kann. Das folgende Beispiel liest Elemente aus der Tabelle ‘Todos’ aus. Weitere Informationen wie ihr mit firebase-php arbeiten könnt, findet ihr unter: https://github.com/kreait/firebase-php

<?php

require ‘backend.php’;

$todos = $database->getReference(‘todos’)->orderByKey()->getSnapshot()->getValue();

foreach ($todos as $key => $value) {
echo $key.’ - ‘.$value[‘title’].’ (‘.$value[‘description’].’)\n’;
}

Verschicken kann man dann eine solche ‘Aufgabe’ mit:

<?php
$note = new Notification($title, $message’);
$note->setIcon(‘notification_icon_resource_name’)->setSound(“default”)->setBadge(1);

$message = new Message();
$message->addRecipient(new Topic(‘todos’));
$message->setNotification($note)->setPriority(“high”)->setTimeToLive(223200);

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

In dem Beispiel wird die Nachricht nur an die Clients verteilt, welche sich auf das Topic ‘todos’ subscribte haben. Hier kann man aber auch z.B. devices auswählen oder an alle verschicken. Mehr dazu unter: https://github.com/Paragraph1/php-fcm Ob das Senden an FCM erfolgreich war kann man mit

$response->getStatusCode()

prüfen. Dabei sagt das Ergebnis aber nur aus ob die Nachricht an FCM übermittelt wurde, aber nicht ob die Clients diese erfolgreich erhalten haben.