我正在通过 PHP 成功获取 Apple APNS 反馈数据。我得到的结构(经过一些处理)看起来像这样:
时间戳
设备令牌
我的问题是如何知道我应该从数据库中删除哪些设备令牌并停止向它们发送通知。
问候,
姆拉乔
我正在通过 PHP 成功获取 Apple APNS 反馈数据。我得到的结构(经过一些处理)看起来像这样:
时间戳
设备令牌
我的问题是如何知道我应该从数据库中删除哪些设备令牌并停止向它们发送通知。
问候,
姆拉乔
时间戳是这里的关键元素。Apple 发送的时间戳表示推送服务上次尝试向设备传递消息并发现要卸载的应用程序的时间。如果设备此后重新注册了您的服务,则无需将其删除。
因此,每次您的应用程序加载并将令牌发送到您的服务时,您都应该在数据存储中记录时间。当您运行反馈时,您应该检查来自 Apple 的时间,并将其与您上次从设备上的应用程序收到更新的时间进行比较。如果 Apple 发送的时间比您收到更新的时间更新,那么您应该删除(或禁用)该设备。如果来自 Apple 的时间较早,那么您不需要删除它,因为自 Apple 上次尝试交付以来用户已经重新安装了设备。
All devices given by feedback are 'failed' and should be removed. No feedback means no devices should be removed. It's covered over on the Apple Documentation:
@fyasar,
因此,您的建议是根据设备 ID(或某些密钥)存储设备令牌。当收到有关设备令牌的反馈时,请从 DB 中删除该设备令牌行,对吗?如果理解正确,那么在用户安装应用程序,卸载它然后在短时间内再次安装它并且只有在所有这些发生之后才查询反馈服务的情况下,这将不起作用。在这种情况下,如果不考虑反馈中的时间戳,设备令牌将被删除,这是不正确的,因为用户再次安装了应用程序并重新注册了推送通知。
我的问题是,正如苹果文档和许多博客中所建议的那样,在注册时,当设备令牌被持久化时,时间戳必须与它一起被持久化。应该保留哪个时区的 ISO 时间或反馈服务返回时间戳的时区是什么。
简洁的解释@argon,但是我对时间戳还有另一个问题。
每次应用启用推送通知时,设备令牌都会发送到服务器。我是否应该从我的服务器获取时间戳以与设备令牌一起保留,因为 didRegisterForRemoteNotificationsWithDeviceToken 只给出 deviceToken 而不是时间。如果我的服务器在不同的时区运行并且 APNS 在不同的时区运行,则存储的注册时间(连同设备令牌)无法与从 APNS 反馈收到的时间戳进行比较,以检查注册 -> 卸载 -> 重新注册的顺序。
我假设 APNS 反馈时间戳采用 UTC 格式,服务器存储的时间戳与设备令牌必须在存储 ISO 时间戳之前转换为 UTC。这样,时间戳都将位于同一时区,并且差异检查将保持一致。
请说清楚
一个时间戳(作为一个四字节的 time_t 值),指示 APNs 何时确定应用程序不再存在于设备上。该值按网络顺序排列,表示自 1970 年 1 月 1 日午夜 12:00 UTC 以来的秒数。
您可以将其与表的最后插入时间进行比较,然后从数据库中删除无效令牌,在我的情况下,我使用 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;
}
您应该使用设备令牌数据存储设备,然后您可以根据设备令牌找到这些设备。您可以使用设备令牌来识别每个设备。比很容易找到并将它们的状态更改为您的数据库。