1

我正在兜圈子试图弄清楚这一点。让推送通知在 iOS 上工作正常,现在尝试对 android GCM 做同样的事情。我被困在如何公开允许我收集用户注册 ID 的服务上。在我的服务器上使用 java 真的很痛苦,所以只有 php 的解决方案会很有用。到目前为止,我的通知脚本看起来像这样:

require_once('config.php');
require_once 'Zend/Mobile/Push/Gcm.php';
require_once 'Zend/Mobile/Push/Message/Gcm.php';

$con = mysql_connect($CONFIG['db']['host'] , $CONFIG['db']['user'], $CONFIG['db']['pass']);
if (!$con) {
  echo "DBConnectionError: Could not connect to database";
}

$db = mysql_select_db($CONFIG['db']['database'], $con);
if (!$db) {
  echo "DBSelectError: Could not select database";
}

// optain list of devices to send pn to
$qt = "SELECT uid userid, apntoken "
    . "FROM members "
    . "WHERE apntoken IS NOT NULL "
    . "AND uid IN ("
    .   "SELECT fuid userid "
    .   "FROM avail "
    .   "WHERE apnsent IS NOT TRUE "
    .   "UNION "
    .   "SELECT uid userid "
    .   "FROM availbinary "
    .   "WHERE apnsent IS NOT TRUE "
    .   ") ";

//send gcm message
    $message = new Zend_Mobile_Push_Message_Gcm();
    $message->setId(time());
    $message->addToken($tokenRec['apntoken']);
    $message->setData($alert);

    $gcm = new Zend_Mobile_Push_Gcm();
    $gcm->setApiKey('AIzaSyCxxxxxxxxxxxxxxxnFn5mGkM');

    try {
        $response = $gcm->send($message);
    } catch (Zend_Mobile_Push_Exception $e) {
        // all other exceptions only require action to be sent or implementation of exponential backoff.
        die($e->getMessage());
    }

任何想法将不胜感激。

4

1 回答 1

2

您需要在您的 php 上创建一个 POST 方法,以便用户“上传”他们的registration_id。有大量关于如何公开 PHP POST 请求的教程。假设这个 POST 请求的 URI 是http://yourserver/gcm/send_reg_id,这个 body 的 Content-Type 可以是任何你想要的(文本、json、xml)。假设您使用 json,您的应用程序将向上述 url 发送 POST 请求,正文如下:

{ "reg_id" : "asdadsafdsf34ZXZZZZx", "user_id" : "xxxxxx" }

您的服务器将从 POST 请求正文中提取上述 json 字符串,并将 reg_id 插入到您的数据库中。

然后在您的应用程序中,只需使用 gcm-client.jar 库,并在收到 onRegistered() 回调后,将上述 POST 请求发送到您的服务器。

有几点需要考虑:

  1. 使请求 https 是安全的
  2. 添加“user_id”来跟踪用户的注册情况,以便将来提供个性化的推送通知。
于 2012-07-17T15:14:37.643 回答