web-dev-qa-db-fra.com

envoi de notifications Push à plusieurs Android utilisant GCM

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

20
user3225075

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

15
Coderji

J'ai modifié ce qui précède gcm.php un peu pour répondre à mes besoins:

  1. La page doit être automatiquement rechargée dans son format d'origine après l'envoi de la notification Push.
  2. Il doit indiquer le nombre d'utilisateurs enregistrés.
  3. GCM n'autorise pas plus de 1 000 regId à la fois. Il devrait donc s'attaquer à cette situation. (envoi de paquets de 1000 pushnotifications en boucle).

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 .

5
Jahid

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

Source: Tutoriel de messagerie Google Cloud

2
Reyaan Roy

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>
1
Kunal Soneta