>  기사  >  백엔드 개발  >  알림 비활성화와 제거 사이에서 푸시 메시지를 구별할 수 있나요?

알림 비활성화와 제거 사이에서 푸시 메시지를 구별할 수 있나요?

巴扎黑
巴扎黑원래의
2016-11-22 14:35:20923검색

메시지 푸시에는 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[&#39;statusCode&#39;] > 1 && $aError[&#39;statusCode&#39;] <= 8) {
$this->_log("WARNING: Message ID {$k} {$sCustomIdentifier} has an unrecoverable error ({$aError[&#39;statusCode&#39;]}), removing from queue without retrying...");
$this->_removeMessageFromQueue($k, true);
continue 2;
}
}
if (($nErrors = count($aMessage[&#39;ERRORS&#39;])) >= $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[&#39;statusCode&#39;] > 1 && $aError[&#39;statusCode&#39;] <= 8) {
$this->_log("WARNING: Message ID {$k} {$sCustomIdentifier} has an unrecoverable error ({$aError[&#39;statusCode&#39;]}), 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[&#39;error&#39;]) 
                && (($result[&#39;error&#39;] == "NotRegistered")  || ($result[&#39;error&#39;] == "InvalidRegistration")));
            });
        return array_keys($filteredResults);
    }
    /**
     * Returns an array of registration ids for which you must resend a message (?),
     * cause devices aren&#39;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[&#39;error&#39;])
                    &&
                    ($result[&#39;error&#39;] == "Unavailable")
                    );
            });
        return array_keys($filteredResults);
    }
알림이 금지된 경우 위의 두 가지 방법은 오류 토큰을 쓰지 않습니다. 토큰이 금지되어 있다는 것도 유효하며 오류를 반환하지 않습니다.

앱이 제거되면 getInvalidRegistrationIds가 실행되고 $result['error']==NotRegistered

이렇게 GCM이 NotRegistered를 반환하면 다음에 의해 생성된 오류 메시지라는 의미입니다. 제거 및 알림이 금지되며 GCM은 이를 일반 토큰으로 발행합니다.


위 테스트를 통해 apns와 gcm은 금지 알림을 일반 토큰으로 처리하고, 앱을 제거하면 유효하지 않은 토큰으로 처리하는 것으로 나타났습니다. (제거 후 재설치 시 새로운 토큰이 생성됩니다)

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.