Je suis http://javapapers.com/Android/google-cloud-messaging-gcm-for-Android-and-Push-notifications/ ? pour envoyer des notifications Push via GCM. Tout fonctionne bien, mais je peux envoyer une notification Push à un seul appareil. L'enregistrement d'un autre appareil remplace l'ID d'enregistrement de l'appareil précédent. J'ai essayé la solution fournie par Shardool en http://javapapers.com/Android/android-multicast-notification-using-google-cloud-messaging-gcm/ ? mais ça ne marche pas.
Toute suggestion serait d'une grande aide.
Voici mes gcm.php
codes qui enregistrent l'appareil et envoient des notifications Push, mais uniquement à un seul appareil enregistré récemment.
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>
Veuillez me dire comment stocker plusieurs ID d'enregistrement d'appareil dans GCMRegid.txt et envoyer des notifications à chacun des appareils enregistrés
Ici, j'ai réécrit le php en utilisant mysql plutôt que de récupérer les clés du fichier. Dans ce cas, je récupère tous les regIds de la table et les mets dans un tableau et je les passe à la fonction sendPushNotification pour pousser le message à tous. ici vous avez 2 fichiers, un pour se connecter à la base de données et un pour 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>
tout ce que vous avez à faire est de créer une base de données qui a une table d'utilisateurs avec id, regId et name comme colonnes.
J'espère que c'est ce que vous cherchez
J'ai modifié ce qui précède gcm.php un peu pour répondre à mes besoins:
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
?>
MODIFIER:
J'ai réécrit le code PHP avec quelques améliorations et en utilisant MySqli (au lieu de MySql). C'est dans Github .
L'envoi d'une notification push à plusieurs appareils est identique à l'envoi à un appareil individuel. Enregistrez simplement le jeton d'enregistrement de tous les appareils enregistrés sur votre serveur. Et lorsque vous appelez la notification Push avec curl (je suppose que vous utilisez php comme côté serveur) Mettez tous les identifiants d'enregistrement dans un tableau. Ceci est un exemple de code
<?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');
}
}
Le code suivant fonctionne pour moi d'envoyer une notification à tous les utilisateurs enregistrés:
<?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>