プッシュメッセージは、禁止通知とアンインストールの2つのタイプを区別できますか?

3946 ワード

メッセージプッシュiosはapns,androidはgcmを用いた.プッシュに失敗すると無効なtokenが返されますが、無効なtokneでは、禁止通知とappのアンインストールによる通知とを区別できますか?
1 APNS PHPのプッシュバックエラー処理
Push.php

if (!empty($aMessage['ERRORS'])) {
foreach($aMessage['ERRORS'] as $aError) {
if ($aError['statusCode'] == 0) {
$this->_log("INFO: Message ID {$k} {$sCustomIdentifier} has no error ({$aError['statusCode']}), removing from queue...");
$this->_removeMessageFromQueue($k);
continue 2;
} else if ($aError['statusCode'] > 1 && $aError['statusCode'] <= 8) {
$this->_log("WARNING: Message ID {$k} {$sCustomIdentifier} has an unrecoverable error ({$aError['statusCode']}), removing from queue without retrying...");
$this->_removeMessageFromQueue($k, true);
continue 2;
}
}
if (($nErrors = count($aMessage['ERRORS'])) >= $this->_nSendRetryTimes) {
$this->_log(
"WARNING: Message ID {$k} {$sCustomIdentifier} has {$nErrors} errors, removing from queue..."
);
$this->_removeMessageFromQueue($k, true);
continue;
}
}

通知を禁止することによって、apnsはエラーを報告せず、このtokenを無効またはエラーのtokenと見なさない.
appをアンインストールすると、statusCodeが8に等しいという判断が呼び出されます.

if ($aError['statusCode'] > 1 && $aError['statusCode'] <= 8) {
$this->_log("WARNING: Message ID {$k} {$sCustomIdentifier} has an unrecoverable error ({$aError['statusCode']}), removing from queue without retrying...");
$this->_removeMessageFromQueue($k, true);
continue 2;
}

したがって,apnsはアンインストールによるプッシュ失敗を区別できるはずであるが,通知禁止では反応しない.
2 GCMのエラー判定コード分析:
Response.class.php

/**
* Returns an array containing invalid registration ids
* They must be removed from DB because the application was uninstalled from the device.
*
* @return array
*/
public function getInvalidRegistrationIds()
{
if ($this->getFailureCount() == 0) {
return array();
}
$filteredResults = array_filter($this->results,
function($result) {
return (isset($result['error'])
&& (($result['error'] == "NotRegistered") || ($result['error'] == "InvalidRegistration")));
});

return array_keys($filteredResults);
}

/**
* Returns an array of registration ids for which you must resend a message (?),
* cause devices aren't available now.
*
* @TODO: check if it be auto sended later
*
* @return array
*/
public function getUnavailableRegistrationIds()
{
if ($this->getFailureCount() == 0) {
return array();
}
$filteredResults = array_filter($this->results,
function($result) {
return (
isset($result['error'])
&&
($result['error'] == "Unavailable")
);
});

return array_keys($filteredResults);
}

通知が禁止されている場合、上記2つの方法はいずれもエラーtokenに書き込まれません.すなわち、通知が禁止されている場合、tokenも有効であり、エラーは返されません.
appをアンインストールすると、getInvalidRegistrationIdsに実行され、$result['error']=NotRegistered
このように、GCMがNotRegisteredを返すと、アンインストールによるエラーメッセージであり、禁止通知であり、GCMは通常tokenとして送信される.
以上のテストにより、apnsとgcmは禁止通知を正常なtokenとして処理し、appをアンインストールすると無効なtokenとして処理することを示した.(アンインストールして再ロードすると、新しいtokenが生成されます)