2013-11-03 137 views
1

我想为我的android应用程序实现推送通知。我在网上查了一下,从androidhive.com看到一个很好的教程。我一步一步地跟着它,但最终它没有奏效。有7个PHP文件,我已经实现了服务器端。我在000webhost上创建了我的服务器,并创建了它所需的数据库。我的设备可以在我的应用程序服务器上成功注册,这些条目也可以在数据库中看到。但是,我的谷歌API控制台显示没有连接到任何设备。我觉得我的服务器和GCM之间的连接可能存在错误,但这只是一个猜测,我不知道真正的问题。 这里是我的7个PHP文件。在我的android应用程序中使用GCM推送通知

config.php 

    <?php 
    /** 
    * Database config variables 
    */ 
    define("DB_HOST", "mysql9.000webhost.com"); 
    define("DB_USER", "a4307731_enthu"); 
    define("DB_PASSWORD", "(my_password)"); 
    define("DB_DATABASE", "a4307731_GCM"); 

    /* 
    * Google API Key 
    */ 
    define("GOOGLE_API_KEY", "My api key"); 
    ?> 

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

    /** 
    * Getting all users 
    */ 
    public function getAllUsers() { 
     $result = mysql_query("select * FROM gcm_users"); 
     return $result; 
    } 

} 

?> 

GCM.php 

    <?php 

class GCM { 

    //put your code here 
    // constructor 
    function __construct() { 

    } 

    /** 
    * Sending Push Notification 
    */ 
    public function send_notification($registatoin_ids, $message) { 
     // include config 
     include_once './config.php'; 

     // Set POST variables 
     $url = 'https://android.googleapis.com/gcm/send'; 

     $fields = array(
      'registration_ids' => $registatoin_ids, 
      'data' => $message, 
     ); 

     $headers = array(
      'Authorization: key=' . GOOGLE_API_KEY, 
      '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); 

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

} 

?> 
register.php 

    <?php 

// response json 
$json = array(); 

/** 
* Registering a user device 
* Store reg id in users table 
*/ 
if (isset($_POST["name"]) && isset($_POST["email"]) && isset($_POST["regId"])) { 
    $name = $_POST["name"]; 
    $email = $_POST["email"]; 
    $gcm_regid = $_POST["regId"]; // GCM Registration ID 
    // Store user details in db 
    include_once './db_functions.php'; 
    include_once './GCM.php'; 

    $db = new DB_Functions(); 
    $gcm = new GCM(); 

    $res = $db->storeUser($name, $email, $gcm_regid); 

    $registatoin_ids = array($gcm_regid); 
    $message = array("price" => "Welcome To Enthusia Updates"); 

    $result = $gcm->send_notification($registatoin_ids, $message); 

    echo $result; 
} else { 
    // user details missing 
} 
?> 

send_message.php 

    <?php 
if (isset($_GET["regId"]) && isset($_GET["message"])) { 
    $regId = $_GET["regId"]; 
    $message = $_GET["message"]; 

    include_once './GCM.php'; 

    $gcm = new GCM(); 

    $registatoin_ids = array($regId); 
    $message = array("price" => $message); 

    $result = $gcm->send_notification($registatoin_ids, $message); 

    echo $result; 
} 
?> 

index.php 

    <!DOCTYPE html> 
<html> 
    <head> 
     <title></title> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(function(){ 

      }); 
      function sendPushNotification(id){ 
       var data = $('form#'+id).serialize(); 
       $('form#'+id).unbind('submit');     
       $.ajax({ 
        url: "send_message.php", 
        type: 'GET', 
        data: data, 
        beforeSend: function() { 

        }, 
        success: function(data, textStatus, xhr) { 
          $('.txt_message').val(""); 
        }, 
        error: function(xhr, textStatus, errorThrown) { 

        } 
       }); 
       return false; 
      } 
     </script> 
     <style type="text/css"> 
      .container{ 
       width: 950px; 
       margin: 0 auto; 
       padding: 0; 
      } 
      h1{ 
       font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 
       font-size: 24px; 
       color: #777; 
      } 
      div.clear{ 
       clear: both; 
      } 
      ul.devices{ 
       margin: 0; 
       padding: 0; 
      } 
      ul.devices li{ 
       float: left; 
       list-style: none; 
       border: 1px solid #dedede; 
       padding: 10px; 
       margin: 0 15px 25px 0; 
       border-radius: 3px; 
       -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35); 
       -moz-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35); 
       box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35); 
       font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 
       color: #555; 
      } 
      ul.devices li label, ul.devices li span{ 
       font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; 
       font-size: 12px; 
       font-style: normal; 
       font-variant: normal; 
       font-weight: bold; 
       color: #393939; 
       display: block; 
       float: left; 
      } 
      ul.devices li label{ 
       height: 25px; 
       width: 50px;     
      } 
      ul.devices li textarea{ 
       float: left; 
       resize: none; 
      } 
      ul.devices li .send_btn{ 
       background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#0096FF), to(#005DFF)); 
       background: -webkit-linear-gradient(0% 0%, 0% 100%, from(#0096FF), to(#005DFF)); 
       background: -moz-linear-gradient(center top, #0096FF, #005DFF); 
       background: linear-gradient(#0096FF, #005DFF); 
       text-shadow: 0 1px 0 rgba(0, 0, 0, 0.3); 
       border-radius: 3px; 
       color: #fff; 
      } 
     </style> 
    </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; 
     ?> 
     <div class="container"> 
      <h1>No of Devices Registered: <?php echo $no_of_users; ?></h1> 
      <hr/> 
      <ul class="devices"> 
       <?php 
       if ($no_of_users > 0) { 
        ?> 
        <?php 
        while ($row = mysql_fetch_array($users)) { 
         ?> 
         <li> 
          <form id="<?php echo $row["id"] ?>" name="" method="post" onsubmit="return sendPushNotification('<?php echo $row["id"] ?>')"> 
           <label>Name: </label> <span><?php echo $row["name"] ?></span> 
           <div class="clear"></div> 
           <label>Email:</label> <span><?php echo $row["email"] ?></span> 
           <div class="clear"></div> 
           <div class="send_container">         
            <textarea rows="3" name="message" cols="25" class="txt_message" placeholder="Type message here"></textarea> 
            <input type="hidden" name="regId" value="<?php echo $row["gcm_regid"] ?>"/> 
            <input type="submit" class="send_btn" value="Send" onclick=""/> 
           </div> 
          </form> 
         </li> 
        <?php } 
       } else { ?> 
        <li> 
         No Users Registered Yet! 
        </li> 
       <?php } ?> 
      </ul> 
     </div> 
    </body> 
</html> 

Incase,你需要看看我从哪里得到的教程链接。这是 http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

回答

0

的谷歌API控制台是不会告诉你任何东西,即使它的工作:

注:在谷歌API控制台资料for GCM未启用。您必须使用开发者控制台。 Source

您的服务器从疗法GCM服务器告诉你,如果你meesages被GCM接受的响应。如果他们是这样,问题不在于你的服务器代码,所以如果你没有在设备上得到消息,你应该在你的问题中包含客户端代码和清单。

2

嘿,你是否检查过卷曲电话?

是000webhost直接支持curl调用还是使用代理?

如果它使用代理,那么它不会发送消息到设备。