我通过PHP成功获取Apple APNS反馈数据。我得到的结构(经过一些处理后)看起来像这样:
时间戳
设备令牌
我的问题是如何知道我应该从数据库中删除哪些设备令牌并停止向他们发送通知。
Regardz,
Mladjo
答案 0 :(得分:11)
时间戳是这里的关键因素。 Apple发送的时间戳表示推送服务最后一次尝试向设备发送消息并发现要卸载的应用程序。如果此时设备已重新注册您的服务,则无需将其删除。
因此,每次您的应用加载并将令牌发送到您的服务时,您都应该在数据存储中记录时间。当您运行反馈时,您应该检查Apple的时间并将其与您上次从设备上的应用程序收到更新的时间进行比较。如果Apple发送的时间比您更新的时间更新,那么您应该删除(或禁用)设备。如果来自Apple的时间较早,那么您不需要删除它,因为自Apple上次尝试交付以来,用户已重新安装该设备。
答案 1 :(得分:10)
反馈给出的所有设备都“失败”,应该删除。没有反馈意味着不应删除任何设备。它包含在Apple文档中:
答案 2 :(得分:0)
整洁的解释@argon,但是我有另外一个关于时间戳的问题。
每次应用启用推送通知时,设备令牌都会发送到服务器。我应该从服务器获取时间戳,以便与设备令牌一起保存,因为didRegisterForRemoteNotificationsWithDeviceToken只提供deviceToken而不是时间。如果我的服务器在不同的时区运行且APNS在不同的时区运行,则存储的注册时间(连同设备令牌)无法与从APNS反馈接收的时间戳进行比较以检查寄存器的顺序 - >卸载 - >重新注册。
我假设APNS反馈时间戳是UTC,并且在存储ISO时间戳之前,服务器存储的时间戳以及设备令牌必须转换为UTC。这样,时间戳将在同一时区,差异检查将保持一致。
请澄清
答案 3 :(得分:0)
@fyasar,
因此,您的建议是将设备令牌存储在设备ID(或某个密钥)中。收到设备令牌的反馈后,从DB中删除该设备令牌行,对吧?如果已经理解正确,那么在场景中不起作用的是用户安装应用程序,卸载它然后在短时间内再次安装它并且仅在所有这些发生之后才查询反馈服务。在这种情况下,如果不考虑反馈中的时间戳,将删除设备令牌,这是因为用户再次安装了应用程序并重新注册以进行推送通知。
我的问题是,正如Apple doc和许多博客中所建议的那样,在注册时,当设备令牌被持久化时,时间戳必须与之一起持久化。应该保留什么时区的ISO时间或反馈服务返回时间戳的时区。
答案 4 :(得分:0)
指示APN何时的时间戳(作为四字节time_t值) 确定该设备上不再存在该应用。这个值, 它按网络顺序表示自午夜12:00以来的秒数 1970年1月1日UTC。
你可以将它与你的表的最后插入时间进行比较,然后从db中删除无效的令牌,在我的情况下我使用mysql和php for sever side
$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1";
它将从db返回上次更新的时间,然后我只需使用
将其转换为纪元时间戳$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')";
最后我将它与apns反馈时间戳进行比较,就像这样
if($inactive_Timestamp>$dbTime_stamp)
{
foreach ($apnsfeedback_tokens as $key => $value) {
# code...
$inactive_Token=$value['devtoken'];
$sql= "DELETE FROM device_tokens WHERE device_token='$inactive_Token'";
if ($conn->query($sql) === TRUE) {
echo "Record deleted successfully";
} else {
echo "Error deleting record: " . $conn->error;
}
答案 5 :(得分:-1)
您应该使用设备令牌数据存储设备,然后您可以根据设备令牌找到这些设备。您可以将设备令牌用于每个设备的标识符。比很容易找到并将其状态更改为您的数据库。