How to send push notifications to multiple devices using php script using FCM?
Solution 1
Try to send device ID of multiple devices as an array. In your case,
$registration_ids must be an array of device IDs.
E.g
$registration_ids = array('Device ID 1', 'Device ID 2');
Solution 2
If you were to send notification via terminal the data part of the curl command would look like this:
{
"registration_ids": ["device_token_1", "device_token_2"],
"notification": {
"body": "Hello",
"title": "Hello",
"vibrate": 1,
"sound": 1
}
}
PHP code:
$body = array(
'registration_ids' => array("device_token_1", "device_token_2"),
'notification' => array('body' => 'Hello', 'title' => 'Hello', 'vibrate' => 1, 'sound' => 1)
);
Solution 3
Use 'registrations_ids' in place of 'to', if you want to send to the multiple users like:
$fields = array
(
'registration_ids' => $tokens,
'notification' => $msg
);
where $tokens = array("device token 1" , "device token 2");
if you want to send to the single user use 'to' , like
$fields = array
(
'to' => $token,
'notification' => $msg
);
where $token = "device token 1";
Solution 4
$notification_data = $this->common->get_all_record('table name',array()); //get all id from table
if($notification_data != NULL){
foreach ($notification_data as $notification_data_row) {
$registrationIds = $notification_data_row['token'];
#prep the bundle
$msg = array
(
'body' => 'body msg',
'title' => 'title',
'icon' => 'myicon',/*Default Icon*/
'sound' => 'mySound'/*Default sound*/
);
$fields = array
(
'to' => $registrationIds,
'notification' => $msg
);
$headers = array
(
'Authorization: key=' . "your key",
'Content-Type: application/json'
);
#Send Reponse To FireBase Server
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec ( $ch );
// echo "<pre>";print_r($result);exit;
curl_close ( $ch );
}
}
Solution 5
To send firebase notifications to multiple users at once
add multiple firebase tokens to an array.
$token_ids = array('token1', 'token2');
Pass the tokens to the below shown function
Using below shown function you can also send images with your notification
if you don't want to send any image then just pass empty string
sendFirebaseNotification($token_ids ,"notification title", "message", "image_url");
I use this function
function sendFirebaseNotification($fb_key_array, $title, $message, $imageURL){
$authorization_key = "your_auth_key";
$finalPostArray = array('registration_ids' => $fb_key_array,
'notification' => array('body' => $message,
'title' => $title,
"image"=> $imageURL),
"data"=> array("click_action"=> "FLUTTER_NOTIFICATION_CLICK",
"sound"=> "default",
"status"=> "done"));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://fcm.googleapis.com/fcm/send");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,json_encode($finalPostArray)); //Post Fields
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Authorization: key='.$authorization_key));
$server_output = curl_exec ($ch);
curl_close ($ch);
//echo $server_output;
}
Comments
-
Deep Shah almost 3 years
I'm new to push notifications using FCM from php to Android devices. From android side I have generated FCM reg_id & send it over php script & store into mysql database. Now, I would like to send notifications from php script to multiple android devices simultaneously.
Here is the php scripts that are used during sending push notifications :
1.firebase.php (reference link)
<?php class Firebase { // sending push message to single user by firebase reg id public function send($to, $message) { $fields = array( 'to' => $to, 'data' => $message, ); return $this->sendPushNotification($fields); } // sending push message to multiple users by firebase registration ids public function sendMultiple($registration_ids, $message) { $fields = array( 'registration_ids' => $registration_ids, 'data' => $message, ); return $this->sendPushNotification($fields); } // function makes curl request to firebase servers private function sendPushNotification($fields) { require_once('config.php'); // Set POST variables $url = 'https://fcm.googleapis.com/fcm/send'; $headers = array( 'Authorization: key=' . FIREBASE_API_KEY, 'Content-Type: application/json' ); // Open connection $ch = curl_init(); // Set the url, number of POST vars, POST data curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Disabling SSL Certificate support temporarly curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); // Execute post $result = curl_exec($ch); // echo "Result".$result; if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } // Close connection curl_close($ch); return $result; } } ?>
2.push.php : (reference link)
<?php class Push { // push message title private $title; private $message; private $image; // push message payload private $data; // flag indicating whether to show the push // notification or not // this flag will be useful when perform some opertation // in background when push is recevied private $is_background; function __construct() { } public function setTitle($title) { $this->title = $title; } public function setMessage($message) { $this->message = $message; } public function setImage($imageUrl) { $this->image = $imageUrl; } public function setPayload($data) { $this->data = $data; } public function setIsBackground($is_background) { $this->is_background = $is_background; } public function getPush() { $res = array(); $res['data']['title'] = $this->title; $res['data']['is_background'] = $this->is_background; $res['data']['message'] = $this->message; $res['data']['timestamp'] = date('Y-m-d G:i:s'); return $res; } }
3.test.php
<?php include_once('config.php'); require_once('DB_Functions.php'); require_once('firebase.php'); require_once('push.php'); $db = new DB_Functions(); $firebase = new Firebase(); $push = new Push(); if(isset($_POST['send'])) { // $sendvalue = $_POST['send']; ChromePhp::log('send it '.$_POST['send']." user category:".$_POST['user_category']." Title : ".$_POST['message_title']." Message : ".$_POST['message_to_send']); $ucategory = $_POST['user_category']; ChromePhp::log('U category '.$ucategory); // notification title $messageTitle = isset($_POST['message_title']) ? $_POST['message_title'] : ''; // notification message $messageToSend = isset($_POST['message_to_send']) ? $_POST['message_to_send'] : ''; ChromePhp::log('Message Title '.$messageTitle." Message:".$messageToSend); $userslist_with_fcm_id = $db->getUsersFCMId($ucategory); ChromePhp::log('FCM LIST '.$userslist_with_fcm_id->num_rows); // var_dump($userslist_with_fcm_id); $push->setTitle($messageTitle); $push->setMessage($messageToSend); $push->setIsBackground(FALSE); $json = ''; $response = ''; if ($userslist_with_fcm_id->num_rows > 0) { while ($row = mysqli_fetch_array($userslist_with_fcm_id)){ ChromePhp::log('FCM ID '.$row['fcm_id']); $json = $push->getPush(); $regId = $row['fcm_id']; $response = $firebase->send($regId, $json); } } else{ echo '<h3>Oops ! You got empty data</h3>'; } var_dump($response); } ?> <!DOCTYPE html> <html> <head> <title>Admin Panel</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- jQuery UI --> <link href="https://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" media="screen"> <!-- Bootstrap --> <link href="bootstrap/css/bootstrap.min.css" rel="stylesheet"> <!-- styles --> <link href="css/styles.css" rel="stylesheet"> <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet"> <link href="vendors/form-helpers/css/bootstrap-formhelpers.min.css" rel="stylesheet"> <link rel="stylesheet" href="css/pure-min.css"> <link href="css/forms.css" rel="stylesheet"> <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> <!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> <![endif]--> <style type="text/css"> body{ } div.container{ width: 1000px; margin: 0 auto; position: relative; } legend{ font-size: 30px; color: #555; } .btn_send{ background: #00bcd4; } label{ margin:10px 0px !important; } textarea{ resize: none !important; } .fl_window{ width: 400px; position: absolute; right: 0; top:100px; } pre, code { padding:10px 0px; box-sizing:border-box; -moz-box-sizing:border-box; webkit-box-sizing:border-box; display:block; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word; width:100%; overflow-x:auto; } </style> <script type="text/javascript"> function sendMessage() { // alert("method called"); var chx = document.getElementsByTagName('input'); for (var i=0; i<chx.length; i++) { // If you have more than one radio group, also check the name attribute // for the one you want as in && chx[i].name == 'choose' // Return true from the function on first match of a checked item if (chx[i].type == 'radio' && chx[i].checked) { // alert("checked: "+chx[i].value); $.ajax({ url: 'test.php', type: 'post', data: { send:"true", user_category :chx[i].value, message_title : document.getElementById('title').value, message_to_send : document.getElementById('message').value }, success: function(data, textStatus, jqXHR) { //data - response from server // alert("success :".textStatus); }, error: function (jqXHR, textStatus, errorThrown) { // alert("failed :".textStatus); } }); } } } </script> </head> <body> <div class="header"> <div class="container"> <div class="row"> <div class="col-md-5"> <!-- Logo --> <div class="logo"> <h1><a href="index.php">Admin Panel</a></h1> </div> </div> <div class="col-md-5"> </div> <div class="col-md-6"> <div class="navbar navbar-inverse" role="banner"> <nav class="collapse navbar-collapse bs-navbar-collapse navbar-right" role="navigation"> <ul class="nav navbar-nav"> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">My Account <b class="caret"></b></a> <ul class="dropdown-menu animated fadeInUp"> <li><a href="updateProfile.php">Update Profile</a></li> <li><a href="logout.php">Logout</a></li> </ul> </li> </ul> </nav> </div> </div> </div> </div> </div> <div class="page-content"> <div class="row"> <div class="col-md-2"> <div class="sidebar content-box" style="display: block;"> <ul class="nav"> <!-- Main menu --> <li><a href="index.php"><i class="glyphicon glyphicon-tasks"></i>App Users</a></li> <li><a href="halt_sponsors_senate.php"><i class="glyphicon glyphicon-tasks"></i>Senate HALT Supporters</a></li> <li><a href="halt_sponsors_assembly.php"><i class="glyphicon glyphicon-tasks"></i>Assembly HALT Supporters</a></li> <li><a href="brief_call_history.php"><i class="glyphicon glyphicon-tasks"></i>Call History</a></li> <li><a href="send_message.php"><i class="glyphicon glyphicon-tasks"></i>Send Messages</a></li> <!-- <li><a href="voice_prompt_form.php"><i class=class="glyphicon glyphicon-tasks"></i>Voice Prompt</a></li> --> </li> </ul> </div> </div> <div class="col-md-10"> <div class="row"> <div class="col-md-12"> <div class="content-box-large"> <div class="panel-body"> <form class="pure-form pure-form-stacked" method="POST"> <fieldset> <legend>Create Message</legend> <label for="title">Title</label> <input type="text" value="Support Halt" id="title" name="title" class="pure-input-1-2" placeholder="Enter title"> <label for="message">Message</label> <textarea class="pure-input-1-2" name="message" id="message" placeholder="Notification message!" rows="5" >Hello World</textarea> <br> <h5> <input type="radio" id="user_category" name="user_category" value="userswithopponents"> Users with opponents<br> <br> <input type="radio" id="user_category" name="user_category" value="userswithsupporters"> Users with supporters<br> <br> <input type="radio" id="user_category" name="user_category" value="everyone"> Everyone <br> <br> <input type="radio" id="user_category" name="user_category" value="nyresidentsonly"> NY residents only </h5> </br> <input type="hidden" name="push_type" value="individual"/> <button type="submit" class="btn btn-primary" onclick="sendMessage()">Send</button> </fieldset> </form> </div> </div> </div> </div> </div> </div> </div> <link href="vendors/datatables/dataTables.bootstrap.css" rel="stylesheet" media="screen"> <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> <script src="https://code.jquery.com/jquery.js"></script> <!-- jQuery UI --> <script src="https://code.jquery.com/ui/1.10.3/jquery-ui.js"></script> <!-- Include all compiled plugins (below), or include individual files as needed --> <script src="bootstrap/js/bootstrap.min.js"></script> <script src="vendors/datatables/js/jquery.dataTables.min.js"></script> <script src="vendors/datatables/dataTables.bootstrap.js"></script> <script src="js/custom.js"></script> <script src="js/tables.js"></script>
So, as of now I have tried to iterate over all reg_ids from database & call send method but it didn't send notifications to any devices .
-
Ketan Ramani about 6 yearsWorks for me.. Thanks
-
Nimit Bhargava about 6 yearsSo I should use
to
only when I am using one device id to send? -
Murali about 6 years@NimitBhargava if you have one device the
registration_ids
array would contain only one device_token string. No need to useto
-
maswerdna almost 5 yearsIf your array is big, you might exceed maximum execution time on the server while iterating through the array. Correct me if I'm wrong.
-
Suresh Kamrushi over 2 yearsthis is not the best/correct way to do it.
-
Relaxing Music over 2 yearsWhat if I have 1 million users? What is the max limit?