推送消息能不能区分禁止通知和卸载两种类型?

企鹅博客
19514
文章
0
评论
2020年3月1日00:38:58 评论 17 views 2334字阅读7分46秒

消息推送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)

继续阅读
  • 版权声明: 发表于 2020年3月1日00:38:58
  • 转载注明:https://www.qieseo.com/232154.html
绝对零基础,选择做 HTML5 还是 iOS 应用? H5教程

绝对零基础,选择做 HTML5 还是 iOS 应用?

html5不成熟,机遇大,挑战大,ios已成熟但感觉被限制在苹果的圈里面不爽,也不容易出线 回复内容: HTML5只是个附加的东西,不足以成为一种独立的技能。 而且HTML5什么样还不知道呢,现在的火...
苹果IOS/安卓市场首发规则及联系人 产品运营

苹果IOS/安卓市场首发规则及联系人

每位CP在推广刚开始的时候都一头雾水也走过弯路,所以把这些整理出来希望能够帮到做APP运营推广的小伙伴。 注:不保证会存在规则变动。具体以各位实时了解到的信息为准。 安卓市场 百度手机助手 申请方式:...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: