【问题标题】:PHP: How to send GCM notification to multiple devices at one postPHP:如何在一篇文章中向多个设备发送 GCM 通知
【发布时间】:2012-11-15 22:51:09
【问题描述】:

我是一名 android 开发人员,目前正在使用 PHP 开发 GCM 服务器端。从我的客户端,我将 gcm 响应令牌存储在一个数据库中,现在我想一次性向注册用户发送消息。我不知道该怎么做,我完全糊涂了。我的简单 HTML 文件是:

<html>
<head>
<title>
GCM
</title>
</head>
<body topmargin="50" leftmargin="50" CLASS = "bg">
<form action="send_message.php" name="myform" method="post">
<h4>Admin for sending notificaion to the registered user</h4>
Notification Text: <input name="appText" size="15" type="text"/><br>
URL: <input name="url" size="15" type="text" /><br>
<button type="submit">Submit</button>
</form>
</body>
</html>

还有,我的 send_message.php:

<?php
error_reporting (0);

$link = mysql_connect("localhost","db","db"); 
if (!$link) 
 { 
 die(mysql_error()) ; 
 } 
mysql_select_db("gcm_user")or die(mysql_error());
........................................
.....................................
.....................................
?>

现在,在php文件中我该怎么办,我已经尝试了这个链接Android Hive example

刚才,现在通过这个链接来了。请建议我如何使用此解决方案解决我的问题。 New link for my problem.

但我只想要一个 php 用于我的目的。请帮助克服这个 prm。

【问题讨论】:

    标签: php android push-notification google-cloud-messaging


    【解决方案1】:

    回答我自己的问题。这是我为满足我的要求所做的工作。

    $gcm_text = $_POST['gcmText'];
    $gcm_url = $_POST['gcmURL'];
    $gcm_subText = $_POST['gcm_secondText'];
    
    $sql = "select gcm_response_token as regId from GCM";
    $result = mysql_query($sql);
    
    while ($row = mysql_fetch_assoc($result)) {
        $gcm_array[]=$row['regId'];
        $counter++;
    }
    
    mysql_free_result($result);
    
    
        $body['allsearch'] = array(
                'gcmText' => $gcm_text,
                'gcm_secondText' => $gcm_subText,
                'gcmURL' => $gcm_url
                );
    
        // Set POST variables
      $url = 'https://android.googleapis.com/gcm/send';
    
      $fields = array(
     'registration_ids' => $gcm_array,
     'data' => $body,
     );
    
    //echo GOOGLE_API_KEY;
     $headers = array(
     'Authorization: key=$apiKey',
      'Content-Type: application/json'
     );
    
    
    print_r($headers);
    // Open connection
    $ch = curl_init();
    
    // Set the url, number of POST vars, POST data
    curl_setopt($ch, CURLOPT_URL, $url);
    
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    // Disabling SSL Certificate support temporarly
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
    
    // Execute post
    $result = curl_exec($ch);
    if ($result === FALSE) {
        die('Curl failed: ' . curl_error($ch));
    }
    
    // Close connection
    curl_close($ch);
    echo $result;
    
    ?>
    

    通过这个,我能够将 json 数据发送到客户端并获得通知。

    【讨论】:

    • 我遇到了一个奇怪的问题,我有 3 台设备,但只接收 1 台设备,其他设备状态显示成功,设备也连接到互联网,虽然没有收到.. 我的代码有效很好,我希望它适用于一台设备,有什么线索为什么不能在其他两台设备上接收?
    • 试试这个例子来制作服务器。 androidhive.info/2012/10/…
    • 应该在哪里设置 TTL 值?
    【解决方案2】:

    这些链接似乎使 PHP 过于复杂。您要做的就是用来自查询的值填充该 $registrationIDs 数组。我不是 PHP 专家,但我使用了经常引用的 CURL 示例并准备了如下语句:

       $ttl = 86400;
       $randomNum=rand(10,100); 
       $registrationIDs = array();
       .....
    
       $queryregid = "select regid from registrations where  YOUR SPECIFIC CRITERIA......";
       if (!($stmt = $mysqli->prepare( $queryregid))) {
          echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; }
       if (!$stmt->execute()) {  
          echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; }
       if (!$stmt->bind_result($dev_i)){  
          echo "bind failed: (" . $stmt->errno . ") " . $stmt->error;  }
    
       /* fetch values */
       while ($stmt->fetch()) {
          $regidOne =  $dev_i;
          $registrationIDs[] = $regidOne; // Fill the array
       }
       $stmt->close();
    
       $fields = array(
               'registration_ids' => $registrationIDs,
                 'data' => array( "message" => $message),
                 'delay_while_idle'=> false,
                 'time_to_live' => $ttl,
                 'collapse_key'=>"".$randomNum.""
                );
       $headers = array(
            'Authorization: key=' . $apiKey,
             'Content-Type: application/json'
             );
    
       // Open connection
       $ch = curl_init();
    
       // Set the url, number of POST vars, POST data
      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_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode( $fields ));
    
       // Execute post
       $result = curl_exec($ch);
       // Close connection
       curl_close($ch);
    

    .

    【讨论】:

    • 你能把事情更清楚地告诉我吗?我是一个 PHP 菜鸟,无法弄清楚如何做到这一点。你有什么简单的例子可以满足我的要求吗?
    猜你喜欢
    • 2017-07-24
    • 2017-01-08
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多