Android GCM - 如何从我的(第三方)数据库中删除错误的设备令牌?
Android GCM - How to remove bad device tokens from my (third party) database?
我们的数据库中有大约 900 个 Android 设备令牌用于 GCM 推送通知。
我使用这个 PHP 函数将推送指令发送到 GCM 服务器:
function send_android_push($android_gcm_reg_ids, $title, $message, $activityToLaunch) {
global $ANDROID_GCM_API_KEY, $TESTING, $TEST_ANDROID_DEVICE_REG_ID;
if ($TESTING) {
$android_gcm_reg_ids = [
$TEST_ANDROID_DEVICE_REG_ID
];
}
$url = "https://android.googleapis.com/gcm/send";
$data = array(
"title" => $title,
"message" => $message,
"activityToLaunch" => $activityToLaunch,
);
$post = array(
'registration_ids' => $android_gcm_reg_ids,
'data' => $data
);
$headers = array(
'Authorization: key=' . $ANDROID_GCM_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($post));
$result = curl_exec($ch);
if (curl_errno($ch)) {
$result .= "<br />GCM error: " . curl_error($ch);
}
curl_close($ch);
return $result;
}
这是 function/GCM 返回的 JSON 内容的片段:
{
"multicast_id":5609284883833846123,
"success":493,
"failure":401,
"canonical_ids":20,
"results":[
{
"registration_id":"BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ",
"message_id":"0:1462275569015808%814cce86f9fd7ece"
},
{
"registration_id":"BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ",
"message_id":"0:1462275569015815%814cce86f9fd7ece"
},
{
"message_id":"0:1462275569014983%814cce86f9fd7ece"
},
{
"error":"NotRegistered"
},
{
"message_id":"0:1462275569017976%814cce86f9fd7ece"
},
etc., etc.
它似乎在说我的数据库中有 NotRegistered
的设备令牌,但是,如您所见,它没有告诉我哪个设备令牌没有注册,所以我想知道我是怎么做到的可以在我的数据库中将其标记为过时吗?
我认为 GCM 服务器返回的 JSON 数组的元素可能对应于我传递给 send_android_push(...)
函数的 $android_gcm_reg_ids
数组,但那不可能这种情况是因为 BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ registration_id
在 GCM JSON 数组中出现多次 - 尽管相同的标记只在我的数据库中出现一次。
所以大概必须有一些其他方法可以从我的数据库中删除过时的设备令牌??
我担心这个的原因是因为我之前遇到过这种情况(使用 iOS)发送错误的设备令牌(到 APNS)导致推送通知没有发送到有效设备,而且我显然希望让我的数据库保持良好状态。
我在网络上找不到任何帮助,所以也许我遗漏了或弄错了一些明显的东西?
要知道是哪个注册令牌导致的,您必须映射到您向 GCM 请求的 registration_ids
数组中的同一索引。
这里来自 docs:
Results: Array of objects representing the status of the messages processed. The objects are listed in the same order as the request
(i.e., for each registration ID in the request, its result is listed
in the same index in the response).
我们的数据库中有大约 900 个 Android 设备令牌用于 GCM 推送通知。
我使用这个 PHP 函数将推送指令发送到 GCM 服务器:
function send_android_push($android_gcm_reg_ids, $title, $message, $activityToLaunch) {
global $ANDROID_GCM_API_KEY, $TESTING, $TEST_ANDROID_DEVICE_REG_ID;
if ($TESTING) {
$android_gcm_reg_ids = [
$TEST_ANDROID_DEVICE_REG_ID
];
}
$url = "https://android.googleapis.com/gcm/send";
$data = array(
"title" => $title,
"message" => $message,
"activityToLaunch" => $activityToLaunch,
);
$post = array(
'registration_ids' => $android_gcm_reg_ids,
'data' => $data
);
$headers = array(
'Authorization: key=' . $ANDROID_GCM_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($post));
$result = curl_exec($ch);
if (curl_errno($ch)) {
$result .= "<br />GCM error: " . curl_error($ch);
}
curl_close($ch);
return $result;
}
这是 function/GCM 返回的 JSON 内容的片段:
{
"multicast_id":5609284883833846123,
"success":493,
"failure":401,
"canonical_ids":20,
"results":[
{
"registration_id":"BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ",
"message_id":"0:1462275569015808%814cce86f9fd7ece"
},
{
"registration_id":"BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ",
"message_id":"0:1462275569015815%814cce86f9fd7ece"
},
{
"message_id":"0:1462275569014983%814cce86f9fd7ece"
},
{
"error":"NotRegistered"
},
{
"message_id":"0:1462275569017976%814cce86f9fd7ece"
},
etc., etc.
它似乎在说我的数据库中有 NotRegistered
的设备令牌,但是,如您所见,它没有告诉我哪个设备令牌没有注册,所以我想知道我是怎么做到的可以在我的数据库中将其标记为过时吗?
我认为 GCM 服务器返回的 JSON 数组的元素可能对应于我传递给 send_android_push(...)
函数的 $android_gcm_reg_ids
数组,但那不可能这种情况是因为 BPA91bHP29l2j6NPOldcpAvJCJBGk8oQFErfwuh93cxF8ajJJqBlVGqFcxMDEAc2LL2GKwmP86of49UgBTMycB5IdYergWRBETDNUrnzXX_55FgstCZiauPeD7MokIIPOFoOyW9vCRiBqZhlzLCuSnJ1ENFYtIh_PQ registration_id
在 GCM JSON 数组中出现多次 - 尽管相同的标记只在我的数据库中出现一次。
所以大概必须有一些其他方法可以从我的数据库中删除过时的设备令牌??
我担心这个的原因是因为我之前遇到过这种情况(使用 iOS)发送错误的设备令牌(到 APNS)导致推送通知没有发送到有效设备,而且我显然希望让我的数据库保持良好状态。
我在网络上找不到任何帮助,所以也许我遗漏了或弄错了一些明显的东西?
要知道是哪个注册令牌导致的,您必须映射到您向 GCM 请求的 registration_ids
数组中的同一索引。
这里来自 docs:
Results: Array of objects representing the status of the messages processed. The objects are listed in the same order as the request (i.e., for each registration ID in the request, its result is listed in the same index in the response).