notification notificaciones php android notifications google-cloud-messaging

notificaciones - send notification android php



Enviando notificaciones push a mĂșltiples dispositivos Android usando GCM (4)

Aquí reescribí el php usando mysql en lugar de recuperar las claves del archivo. En este caso, recupero todos los registros de la tabla, los coloco en una matriz y los paso a la función sendPushNotification para enviar el mensaje a todos. Aquí tiene 2 archivos, uno para conectarse a la base de datos y otro para 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>

todo lo que tiene que hacer es crear una base de datos que tenga una tabla de usuarios con ID, registro y nombre como columnas.

Espero que esto sea lo que buscas.

Estoy siguiendo http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/ ? para enviar notificaciones push a través de GCM. Todo funciona bien, pero puedo enviar notificaciones push a un solo dispositivo. El registro de otro dispositivo reemplaza la identificación de registro del dispositivo anterior. Probé la solución provista por Shardool en http://javapapers.com/android/android-multicast-notification-using-google-cloud-messaging-gcm/ ? pero no está funcionando.

Cualquier sugerencia sería de gran ayuda.

Aquí están mis códigos gcm.php que registran el dispositivo y envían notificaciones push, pero solo a un único dispositivo registrado recientemente.

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>

Por favor, dígame cómo almaceno los identificadores de registro de múltiples dispositivos en GCMRegid.txt y envío notificaciones a cada uno de los dispositivos registrados


El envío de notificaciones push a múltiples dispositivos es igual a lo que enviamos a dispositivos individuales. Simplemente almacene el token de registro de todos los dispositivos registrados en su servidor. Y cuando llame a la notificación de inserción con curl (supongo que está utilizando php como servidor) coloque todo el ID de registro en una matriz. Este es un código de muestra.

<?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''); } }

Fuente: Tutorial de Google Cloud Messaging


El siguiente código funciona para enviar notificaciones a todos los usuarios registrados:

<?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>


He modificado un poco el gcm.php anterior para satisfacer mis necesidades:

  1. La página se debe volver a cargar automáticamente en su forma original después de enviar una notificación de inserción.
  2. Debe mostrar el número de usuarios registrados.
  3. GCM no permite más de 1000 registros a la vez. Así que debería abordar esa situación. (enviando paquetes de 1000 pushnotifications en un bucle).

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 ?>

EDITAR:

He reescrito el código PHP con algunas mejoras y usando MySqli (en lugar de MySql). Está en Github .