Я следую http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/ ? для отправки push-уведомлений через GCM. Все работает нормально, но я могу отправить push-уведомление только одному устройству. Регистрация другого устройства заменяет идентификатор регистрации предыдущего устройства. Я пробовал решение, предоставленное Shardool в http://javapapers.com/android/android-multicast-notification-using-google-cloud-messaging-gcm/ ? но он не работает.
Любое предложение было бы очень полезно.
Вот мои коды gcm.php
которые регистрируют устройство и отправляют push-уведомления, но только для одного зарегистрированного устройства.
gcm.php
<?php //generic php function to send GCM push notification function sendPushNotificationToGCM($registatoin_ids, $message) { //Google cloud messaging GCM-API url $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registatoin_ids, 'data' => $message, ); // Google Cloud Messaging GCM API Key define("GOOGLE_API_KEY", "MY_KEY"); $headers = array( 'Authorization: key=' . GOOGLE_API_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $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)); $result = curl_exec($ch); if ($result === FALSE) { die('Curl failed: ' . curl_error($ch)); } curl_close($ch); return $result; } ?> <?php //this block is to post message to GCM on-click $pushStatus = ""; if ( ! empty($_GET["push"])) { $gcmRegID = file_get_contents("GCMRegId.txt"); $pushMessage = $_POST["message"]; if (isset($gcmRegID) && isset($pushMessage)) { $gcmRegIds = array($gcmRegID); $message = array("m" => $pushMessage); $pushStatus = sendPushNotificationToGCM($gcmRegIds, $message); } } //this block is to receive the GCM regId from external (mobile apps) if ( ! empty($_GET["shareRegId"])) { $gcmRegID = $_POST["regId"]; file_put_contents("GCMRegId.txt",$gcmRegID); echo "Ok!"; exit; } ?> <html> <head> <title>Google Cloud Messaging (GCM) Server in PHP</title> </head> <body> <h1>Google Cloud Messaging (GCM) Server in PHP</h1> <form method="post" action="gcm.php/?push=1"> <div> <textarea rows="2" name="message" cols="23" placeholder="Message to transmit via GCM"></textarea> </div> <div><input type="submit" value="Send Push Notification via GCM" /></div> </form> <p><h3><?php echo $pushStatus; ?></h3></p> </body> </html>
Скажите, пожалуйста, как хранить несколько идентификаторов регистрации устройства в файле GCMRegid.txt и отправлять уведомления каждому зарегистрированному устройству
Здесь я переписал php, используя mysql, вместо того, чтобы извлекать ключи из файла. В этом случае я извлекаю все регистры из таблицы и помещаю их в массив и передаю его функции sendPushNotification, чтобы отправить сообщение всем. здесь у вас есть 2 файла, один для подключения к базе данных и один для GCM:
connect.php:
<?php $db_host = "localhost"; $db_user = "root"; //change to your database username, it is root by default $db_pass = ''; //change to your database password, for XAMPP it is nothing for WAMPP it is root $db_db = 'gcmFirst'; //change to your database name if(!@mysql_connect($db_host, $db_user, $db_pass) || !@mysql_select_db($db_db)) { die('couldnt connect to database ' .mysql_error()); } ?>
gcm.php
<?php require 'connect.php'; function sendPushNotification($registration_ids, $message) { $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registration_ids, 'data' => $message, ); define('GOOGLE_API_KEY', 'AIzaSyCjctNK2valabAWL7rWUTcoRA-UAXI_3ro'); $headers = array( 'Authorization:key=' . GOOGLE_API_KEY, 'Content-Type: application/json' ); echo json_encode($fields); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); if($result === false) die('Curl failed ' . curl_error()); curl_close($ch); return $result; } $pushStatus = ''; if(!empty($_GET['push'])) { $query = "SELECT regId FROM users"; if($query_run = mysql_query($query)) { $gcmRegIds = array(); while($query_row = mysql_fetch_assoc($query_run)) { array_push($gcmRegIds, $query_row['regId']); } } $pushMessage = $_POST['message']; if(isset($gcmRegIds) && isset($pushMessage)) { $message = array('message' => $pushMessage); $pushStatus = sendPushNotification($gcmRegIds, $message); } } if(!empty($_GET['shareRegId'])) { $gcmRegId = $_POST['regId']; $query = "INSERT INTO users VALUES ('', '$gcmRegId')"; if($query_run = mysql_query($query)) { echo 'OK'; exit; } } ?> <html> <head> <title>Google Cloud Messaging (GCM) Server in PHP</title> </head> <body> <h1>Google Cloud Messaging (GCM) Server in PHP</h1> <form method = 'POST' action = 'gcm.php/?push=1'> <div> <textarea rows = 2 name = "message" cols = 23 placeholder = 'Messages to Transmit via GCM'></textarea> </div> <div> <input type = 'submit' value = 'Send Push Notification via GCM'> </div> <p><h3><?php echo $pushStatus ?></h3></p> </form> </body> </html>
все, что вам нужно сделать, это создать базу данных, в которой есть таблица пользователей с идентификатором, регистром и именем в виде столбцов.
Надеюсь, это то, что вы ищете
Я немного изменил приведенный выше gcm.php, чтобы удовлетворить мои потребности:
gcm_main.php:
<?php require 'connect.php'; //this is the same as as other answers on this topic function sendPushNotification($registration_ids, $message) { $url = 'https://android.googleapis.com/gcm/send'; $fields = array( 'registration_ids' => $registration_ids, 'data' => $message, ); define('GOOGLE_API_KEY', 'your_google_api_key_here'); $headers = array( 'Authorization:key=' . GOOGLE_API_KEY, 'Content-Type: application/json' ); echo json_encode($fields); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); if($result === false) die('Curl failed ' . curl_error()); curl_close($ch); return $result; } function redirect($url) { if (!headers_sent()) { header('Location: '.$url); exit; } else { echo '<script type="text/javascript">'; echo 'window.location.href="'.$url.'";'; echo '</script>'; echo '<noscript>'; echo '<meta http-equiv="refresh" content="0;url='.$url.'" />'; echo '</noscript>'; exit; } } $pushStatus = ''; if(!empty($_GET['push'])) { $query = "SELECT gcm_regid FROM gcm_users"; if($query_run = mysql_query($query)) { $gcmRegIds = array(); while($query_row = mysql_fetch_assoc($query_run)) { array_push($gcmRegIds, $query_row['gcm_regid']); } } $pushMessage = $_POST['message']; if(isset($gcmRegIds) && isset($pushMessage)) { $message = array('price' => $pushMessage); $regIdChunk=array_chunk($gcmRegIds,1000); foreach($regIdChunk as $RegId){ $pushStatus = sendPushNotification($RegId, $message);} } $url="url_to_this_php_file"; redirect($url); } if(!empty($_GET['shareRegId'])) { $gcmRegId = $_POST['gcm_regid']; $query = "INSERT INTO gcm_users VALUES ('', '$gcmRegId')"; if($query_run = mysql_query($query)) { // echo 'OK'; exit; } } ?> <html> <head> <title>Whatever Title</title> </head> <body> <?php include_once 'db_functions.php'; $db = new DB_Functions(); $users = $db->getAllUsers(); if ($users != false) $no_of_users = mysql_num_rows($users); else $no_of_users = 0; ?> <h1>Whatever you want</h1> <h2>Whatever you want</h2> <h3>Push Notification Admin Panel</h3> <h4>Current Registered users: <?php echo $no_of_users; ?></h4> <h4></h4> <form method = 'POST' action = 'gcm_main.php/?push=1'> <div> <textarea rows = "3" name = "message" cols = "75" placeholder = "Type message here"></textarea> </div> <div> <input type = "submit" value = "Send Notification"> </div> </form> </body> </html>
db_connect.php:
<?php class DB_Connect { // constructor function __construct() { } // destructor function __destruct() { // $this->close(); } // Connecting to database public function connect() { require_once 'config.php'; // connecting to mysql $con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD); // selecting database mysql_select_db(DB_DATABASE); // return database handler return $con; } // Closing database connection public function close() { mysql_close(); } } ?>
db_functions.php:
<?php class DB_Functions { private $db; //put your code here // constructor function __construct() { include_once './db_connect.php'; // connecting to database $this->db = new DB_Connect(); $this->db->connect(); } // destructor function __destruct() { } /** * Storing new user * returns user details */ public function storeUser($name, $email, $gcm_regid) { // insert user into database $result = mysql_query("INSERT INTO gcm_users(name, email, gcm_regid, created_at) VALUES('$name', '$email', '$gcm_regid', NOW())"); // check for successful store if ($result) { // get user details $id = mysql_insert_id(); // last inserted id $result = mysql_query("SELECT * FROM gcm_users WHERE id = $id") or die(mysql_error()); // return user details if (mysql_num_rows($result) > 0) { return mysql_fetch_array($result); } else { return false; } } else { return false; } } /** * Get user by email and password */ public function getUserByEmail($email) { $result = mysql_query("SELECT * FROM gcm_users WHERE email = '$email' LIMIT 1"); return $result; } /** * Getting all users */ public function getAllUsers() { $result = mysql_query("select * FROM gcm_users"); return $result; } /** * Check user is existed or not */ public function isUserExisted($id) { $result = mysql_query("SELECT gcm_regid from gcm_users WHERE gcm_regid = '$id'"); $no_of_rows = mysql_num_rows($result); if ($no_of_rows > 0) { // user existed return true; } else { // user not existed return false; } } public function deleteUser($id){ $result=mysql_query("DELETE FROM gcm_users WHERE gcm_regid = '$id'"); } } ?>
config.php:
<?php /** * Database config variables */ define("DB_HOST", "localhost"); define("DB_USER", "root"); define("DB_PASSWORD", ""); define("DB_DATABASE", "gcm"); /* * Google API Key */ define("GOOGLE_API_KEY", "your_google_api_key_here"); // Place your Google API Key ?>
РЕДАКТИРОВАТЬ:
Я переписал PHP-код с некоторыми уточнениями и использовал MySqli (вместо MySql). Это в Гитубе .
Отправка Push Notification на несколько устройств аналогична отправке на отдельное устройство. Просто сохраните регистрационный токен всех зарегистрированных устройств на вашем сервере. И при вызове push-уведомления с curl (я предполагаю, что вы используете php как серверную). Поместите весь идентификатор регистрации в массив. Это пример кода
<?php //Define your GCM server key here define('API_ACCESS_KEY', 'your server api key'); //Function to send push notification to all function sendToAll($message) { $db = new DbOperation(); $tokens = $db->getAllToken(); $regTokens = array(); while($row = $tokens->fetch_assoc()){ array_push($regTokens,$row['token']); } sendNotification($regTokens,$message); } //function to send push notification to an individual function sendToOne($email,$message){ $db = new DbOperation(); $token = $db->getIndividualToken($email); sendNotification(array($token),$message); } //This function will actually send the notification function sendNotification($registrationIds, $message) { $msg = array ( 'message' => $message, 'title' => 'Android Push Notification using Google Cloud Messaging', 'subtitle' => 'www.simplifiedcoding.net', 'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 'vibrate' => 1, 'sound' => 1, 'largeIcon' => 'large_icon', 'smallIcon' => 'small_icon' ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/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); curl_close($ch); $res = json_decode($result); $flag = $res->success; if($flag >= 1){ header('Location: index.php?success'); }else{ header('Location: index.php?failure'); } }
Источник: Учебник Google Cloud Messaging
Следующий код работает для меня, чтобы отправлять уведомления всем зарегистрированным пользователям:
<?php header("Access-Control-Allow-Origin: *"); $db_host = 'localhost'; //hostname $db_user = ''; // username $db_password = ''; // password $db_name = ''; //database name $link = mysqli_connect($db_host,$db_user,$db_password, $db_name); $query = "select * from device_notification_id"; $result = mysqli_query ($link,$query); while($row=mysqli_fetch_array($result)){ $device_to[] = $row[device_id]; } if(isset($_POST['submit'])){ $title=$_POST['title']; $message=$_POST['message']; for($i=0 ; $i< sizeof($device_to) ; $i++) { //echo $to[$i]; $to = $device_to[$i]; sendPush($to,$title,$message); } } function sendPush($to,$title,$message) { // API access key from Google API's Console // replace API define( 'API_ACCESS_KEY', 'AIdfSyCd8ha2wop84LKtpQvRmCEiY8ZLpeTg2-o'); $registrationIds = array($to); $msg = array ( 'message' => $message, 'title' => $title, 'vibrate' => 1, 'sound' => 1 // you can also add images, additionalData ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/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 ); curl_close( $ch ); echo $result; } ?> <html> <form method="POST"> <input type="text" name="title"> <input type="text" name="message"> <input type="submit" name="submit" value="submit"> </form> </html>
в<?php header("Access-Control-Allow-Origin: *"); $db_host = 'localhost'; //hostname $db_user = ''; // username $db_password = ''; // password $db_name = ''; //database name $link = mysqli_connect($db_host,$db_user,$db_password, $db_name); $query = "select * from device_notification_id"; $result = mysqli_query ($link,$query); while($row=mysqli_fetch_array($result)){ $device_to[] = $row[device_id]; } if(isset($_POST['submit'])){ $title=$_POST['title']; $message=$_POST['message']; for($i=0 ; $i< sizeof($device_to) ; $i++) { //echo $to[$i]; $to = $device_to[$i]; sendPush($to,$title,$message); } } function sendPush($to,$title,$message) { // API access key from Google API's Console // replace API define( 'API_ACCESS_KEY', 'AIdfSyCd8ha2wop84LKtpQvRmCEiY8ZLpeTg2-o'); $registrationIds = array($to); $msg = array ( 'message' => $message, 'title' => $title, 'vibrate' => 1, 'sound' => 1 // you can also add images, additionalData ); $fields = array ( 'registration_ids' => $registrationIds, 'data' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); $ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/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 ); curl_close( $ch ); echo $result; } ?> <html> <form method="POST"> <input type="text" name="title"> <input type="text" name="message"> <input type="submit" name="submit" value="submit"> </form> </html>