Hmm, da gibt es genug Ansätze.
Du baust dir einen FCM Listener, der auf eine DB Update Topic/Action reagiert. Dann können deine Clients die PushMessage dann verarbeiten.
Beachte aber, dass FCM Messages Größenbeschränkt sind (genaue Angabe hab ich gerade nicht im Kopf), d.h. wenn deine DB Einträge diesen Wert übersteigen, kannst du die nicht direkt per FCM übertragen, sondern nur ein Token, mit dem du dir dann beim Server die passenden Daten holen musst.
Meine Implementation sieht in etwa so aus (schon ne weile her, das ich das gemacht hab, versucht so gut wie möglich in OOP und daher keine PHP7.x style ):
require_once("Database.class.php"); //DB kommunikation
class FirebaseCloudMessagingHandler{
protected $apiKey;
protected $ids=array();
public $db;
protected $url= 'https://fcm.googleapis.com/fcm/send';
public function __construct($apiKey){
$this->db = new Database(databaseName);
$this->apiKey = $apiKey;
$this->ids = $this->db->getFCMRegistrationIds(); //ClientRegistrationIDs lesen
}
//Send FCM to All Clients -- $message = MessageObjekt mit verschiedenen Feldern als Json
public function sendMessage($message){
//setup fields + headers
$fields = array(
'to' => $this->ids,
'data' => array( "action" => $message ),
//Action ist dann das Topic, am besten die FCM API Dok anschauen
);
$headers = array(
'Authorization: key=' . $this->apiKey,
'Content-Type: application/json'
);
//lets curl
// Open connection
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt( $ch, CURLOPT_URL, $this->url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
// Execute post
$result = curl_exec($ch);
print_r($result);
// Close connection
curl_close($ch);
echo $result ."\n";
}
//SendMessage to several IDs
public function sendMessageToIds($message,$IdsToReceive){
//setup fields + headers
$fields = array(
'registration_ids' => $IdsToReceive,
'data' => array( "action" => $message ),
);
$headers = array(
'Authorization: key=' . $this->apiKey,
'Content-Type: application/json'
);
//lets curl
// Open connection
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt( $ch, CURLOPT_URL, $this->url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );
// Execute post
$result = curl_exec($ch);
if ($result === FALSE) {
die('FCM Send Error: ' . curl_error($ch)); //evtl. error handling
}
// Close connection
curl_close($ch);
echo $result ."\n";
}
}
Natürlich brauchst du dann noch ein Skript, das beim AppStart die ClientRegistrationId von FCM an deinen Server überträgt. Und das würde ich fast immer beim Start aufrufen, keine Ahnung wann sich die ID ändern kann, aber hatte es schon, dass die sich einfach geändert hat z.b. nach Software Update
Ohne FCM kannst du nur Pollen, das ist kaum eine Option. Oder du hast den Server komplett in der Hand, dann kannst du auch ne TCP aufmachen, aber auf Dauer bracuht das auch genug Akku...
Und eine direktverbindung zu einer Eventgesteuerten DB würde ich direkt lassen.
Evtl. kann Google Firebase DB ja sowas, aber dann hast du auch wieder Google komponenten drin.
Das ganze kannst du natürlich vermeiden indem du keine Offlinearbeit zulässt und einen SingleUserMode hast, wo immer nur einer Bearbeiten darf. Das schränkt aber ungemein ein...
— geändert am 16.02.2019, 21:15:01
LG Pascal //It's not a bug, it's a feature.
Empfohlener redaktioneller Inhalt
Mit Deiner Zustimmung wird hier ein externer Inhalt geladen.
Mit Klick auf den oben stehenden Button erklärst Du Dich damit einverstanden, dass Dir externe Inhalte angezeigt werden dürfen. Dabei können personenbezogene Daten an Drittanbieter übermittelt werden. Mehr Infos dazu findest Du in unserer Datenschutzerklärung.