2014-09-16 8 views
18

Sto seguendo http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/? per inviare notifiche push tramite GCM. Tutto funziona bene, ma sono in grado di inviare notifiche push a un solo dispositivo. La registrazione di un altro dispositivo sostituisce l'ID di registrazione del dispositivo precedente. Ho provato la soluzione fornita da Shardool in http://javapapers.com/android/android-multicast-notification-using-google-cloud-messaging-gcm/? ma non funzionainvio di notifiche push a più dispositivi Android tramite GCM

Qualsiasi suggerimento sarebbe di grande aiuto.

Questi sono i codici gcm.php che registra il dispositivo e invia notifiche push, ma solo a un singolo dispositivo registrato di recente.

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> 

Ti prego, dimmi come faccio a memorizzare più ID di registrazione dispositivo in GCMRegid.txt e inviare notifiche ad ogni del dispositivo registrato

risposta

15

Qui ho riscritto il php usando mysql piuttosto che recuperare le chiavi dal file. In questo caso, recupererò tutti i valori regIds dalla tabella e li inseriremo in un array e lo passeremo alla funzione sendPushNotification per inviare il messaggio a tutti. qui ci sono 2 file, uno per connessione al database e una per 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([email protected]_connect($db_host, $db_user, $db_pass) || [email protected]_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> 

tutto quello che dovete fare è creare un database che ha una tabella utenti con ID, regId e nome come colonne.

Spero che questo è quello che stai cercando

+0

ho provato ma ha appena m Potresti per favore condividere con me il file RegisterActivity.java per accedere a Mysql – user3225075

+0

sono in grado di registrare dispositivi nel database mysql .. ma puoi condividere con me l'intero gcm.php che invierà notifiche push a più dispositivi? ? – user3225075

+0

Qui ho modificato la mia risposta, ho 2 file php uno per la connessione al database e uno per gcm – Coderji

5

Ho modificato il sopra gcm.php un po 'per soddisfare le mie esigenze:

  1. la pagina deve essere ricaricato automaticamente alla sua forma originale dopo invio di notifiche push.
  2. Dovrebbe mostrare il numero di utenti registrati.
  3. GCM non consente più di 1000 regId alla volta. Quindi dovrebbe affrontare quella situazione. (invio di pacchetti di 1000 pushnotifications in un ciclo).

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

EDIT:

ho riscritto il codice PHP con alcuni affinamenti e l'utilizzo MySQLi (invece di MySql). È in Github.

+0

ho usato 'sendPushNotification()' e mettere tutti i valori manualmente, il messaggio di ritorno ricciolo ' "risultati": [{ "errore": "NotRegistered"}]' Cosa posso fare –

+0

@Irfan l'ID del dispositivo che è stato inviato al GCM non è stato registrato. Devi prima registrare correttamente il tuo Android con GCM e poi archiviare l'id nel server. Se hai registrato l'ID con GCM, potrebbe essere scaduto (comunque strano), quindi potresti dover registrare nuovamente. E potrebbe anche accadere se stai usando un emulatore. Provalo con un dispositivo reale ... – Jahid

1

Invio Push Notification per più dispositivi è la stessa come trasmettiamo singolo dispositivo. Basta memorizzare il token di registrazione di tutti i dispositivi registrati sul server. E quando si chiama la notifica push con arricciatura (presumo che tu stia usando php come lato server) Metti tutto l'ID di registrazione in un array. Si tratta di un codice di esempio

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

Fonte: Google Cloud Messaging Tutorial

0

A seguito dei lavori di codice per me per inviare la notifica a tutti gli utenti registrati:

<?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)){ 
 
    \t \t 
 
    \t \t $device_to[] = $row[device_id]; 
 
    \t \t 
 
    \t \t \t 
 
} 
 

 

 

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

 

 
} 
 
\t function sendPush($to,$title,$message) 
 
\t { 
 
// API access key from Google API's Console 
 
// replace API 
 
\t \t define('API_ACCESS_KEY', 'AIdfSyCd8ha2wop84LKtpQvRmCEiY8ZLpeTg2-o'); 
 
\t \t $registrationIds = array($to); 
 
\t \t 
 
\t \t 
 

 
\t $msg = array 
 
\t (
 
\t 'message' => $message, 
 
\t 'title' => $title, 
 
\t 'vibrate' => 1, 
 
\t 'sound' => 1 
 

 
// you can also add images, additionalData 
 
); 
 

 

 
\t $fields = array 
 
\t (
 
\t \t 'registration_ids' => $registrationIds, 
 
\t \t '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>

+0

puoi spiegare un po 'di cosa sono gli ID di registrazione e dove/come ottenerlo? – August