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'');
}
}
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:
- La página se debe volver a cargar automáticamente en su forma original después de enviar una notificación de inserción.
- Debe mostrar el número de usuarios registrados.
- 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 .