如何删除由苹果APNS反馈收到的设备令牌

7

我成功地通过PHP获取了Apple APNS反馈数据。经过一些处理后,我得到的结构大致如下:

时间戳

设备令牌

我的问题是如何知道应该从我的数据库中删除哪些设备令牌并停止向它们发送通知。

敬礼,

Mladjo

6个回答

13

时间戳在这里是至关重要的元素。Apple发送的时间戳表示推送服务最后尝试向设备传递消息并发现应用已被卸载的时间。如果设备此后重新注册了您的服务,则无需将其删除。

因此,每次您的应用程序加载并将令牌发送到您的服务时,都应该将时间记录在数据存储中。运行反馈时,您应该检查来自Apple的时间,并将其与您上次从设备上的应用程序接收更新的时间进行比较。如果Apple发送的时间比您收到的更新时间更晚,则应删除(或禁用)该设备。如果来自Apple的时间比您不需要删除它,因为用户自上次Apple尝试传递以来已经重新安装设备。


9
所有反馈的设备都应该被“删除”,没有反馈意味着不应该删除任何设备。这在苹果文档中有详细说明:Apple APN Documentation

1
APNS反馈会返回设备令牌,如果通知传递失败了。这并不意味着应用程序已经从设备中卸载,可能只是用户此时没有持久的WiFi连接。 - Mladen
1
这不是文档所说的。如果提供程序尝试向应用程序发送推送通知,但应用程序在设备上不存在,则设备会将此事实报告给Apple Push Notification Service。当用户卸载应用程序时,经常会出现这种情况。如果设备为某个应用程序报告了传递失败的尝试,则APNs需要一些方法来通知提供程序,以便它可以避免向该设备发送通知。 - Lee
5
@Mladen. 错误。如果设备没有Wi-Fi或3/4G连接,那么当设备重新连接网络时,苹果将稍后发送推送通知。 - midspace

0
一个时间戳(作为四字节 time_t 值),表示 APNs 确定应用在设备上不再存在的时间。这个值按网络顺序排序,表示自 1970 年 1 月 1 日 UTC午夜12点以来的秒数。
您可以将其与您表格的最后插入时间进行比较,然后从数据库中删除无效令牌,在我的情况下,我使用 MySQL 和 PHP 来进行服务器端处理。
$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1";

它将从数据库返回最后更新时间,然后我只需使用方法将其转换为时期的时间戳。
$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;
}

0

很好的解释@argon,但是我有一个关于时间戳的问题。

每次当应用程序启用推送通知时,设备令牌将被发送到服务器。我应该从我的服务器中获取时间戳并将其与设备令牌一起持久化,因为didRegisterForRemoteNotificationsWithDeviceToken只提供了deviceToken而没有时间。如果我的服务器运行在不同的时区,而APNS运行在不同的时区,则存储的注册时间(以及设备令牌)无法与从APNS反馈接收到的时间戳进行比较,以检查注册 -> 卸载 -> 重新注册的顺序。

我假设APNS反馈时间戳是UTC时间,服务器存储的时间戳必须在存储ISO时间戳之前转换为UTC时间。这样,两个时间戳将处于相同的时区,并且差异检查将保持一致。

请澄清一下。


没错,它是一个 UTC 时间戳,所以你应该在存储中存储 UTC 值。参考:“反馈服务”下的最后一张表 - argon

0

@fyasar,

你的建议是将设备令牌存储在设备ID(或某个键)中。当接收到设备令牌的反馈时,从数据库中删除该设备令牌行,对吗?如果我理解正确,在用户在短时间内安装应用程序、卸载它,然后再次安装它并重新注册推送通知之后,只有在所有这些操作完成后才查询反馈服务的情况下,这种方法将无法正常工作。在这种情况下,如果不考虑反馈中的时间戳,则会删除设备令牌,这是不正确的,因为用户已经重新安装了应用程序并重新注册了推送通知。

我的问题是,如苹果文档和许多博客所建议的,在注册时,当设备令牌被持久化时,必须同时持久化时间戳。应该持久化哪个时区的ISO时间,或者反馈服务返回时间戳的时区是什么。


-1
你应该使用设备令牌数据存储设备,并通过其设备令牌查找这些设备。你可以使用设备令牌作为每个设备的标识符,这样就很容易在数据库中找到并更改它们的状态了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接