메시지 푸시에는 iOS는 apns를, 안드로이드는 gcm을 사용합니다. 푸시에 실패하면 유효하지 않은 토큰이 반환됩니다. 그런데 유효하지 않은 토큰 중에서 어떤 것이 금지된 알림인지, 어떤 것이 앱 제거로 인해 발생했는지 구분할 수 있나요?
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는 오류를 보고하지 않으며 이 토큰을 유효하지 않거나 잘못된 토큰으로 간주하지 않습니다. .
앱을 제거하면 다음과 같은 판단이 호출됩니다. 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); }알림이 금지된 경우 위의 두 가지 방법은 오류 토큰을 쓰지 않습니다. 토큰이 금지되어 있다는 것도 유효하며 오류를 반환하지 않습니다.
앱이 제거되면 getInvalidRegistrationIds가 실행되고 $result['error']==NotRegistered
이렇게 GCM이 NotRegistered를 반환하면 다음에 의해 생성된 오류 메시지라는 의미입니다. 제거 및 알림이 금지되며 GCM은 이를 일반 토큰으로 발행합니다.
위 테스트를 통해 apns와 gcm은 금지 알림을 일반 토큰으로 처리하고, 앱을 제거하면 유효하지 않은 토큰으로 처리하는 것으로 나타났습니다. (제거 후 재설치 시 새로운 토큰이 생성됩니다)