我成功地通过PHP获取了Apple APNS反馈数据。经过一些处理后,我得到的结构大致如下:
时间戳
设备令牌
我的问题是如何知道应该从我的数据库中删除哪些设备令牌并停止向它们发送通知。
敬礼,
Mladjo
我成功地通过PHP获取了Apple APNS反馈数据。经过一些处理后,我得到的结构大致如下:
时间戳
设备令牌
我的问题是如何知道应该从我的数据库中删除哪些设备令牌并停止向它们发送通知。
敬礼,
Mladjo
时间戳在这里是至关重要的元素。Apple发送的时间戳表示推送服务最后尝试向设备传递消息并发现应用已被卸载的时间。如果设备此后重新注册了您的服务,则无需将其删除。
因此,每次您的应用程序加载并将令牌发送到您的服务时,都应该将时间记录在数据存储中。运行反馈时,您应该检查来自Apple的时间,并将其与您上次从设备上的应用程序接收更新的时间进行比较。如果Apple发送的时间比您收到的更新时间更晚,则应删除(或禁用)该设备。如果来自Apple的时间比您不需要删除它,因为用户自上次Apple尝试传递以来已经重新安装设备。
$sql="SELECT insert_time from device_tokens ORDER BY insert_time DESC LIMIT 1";
$sql1="SELECT UNIX_TIMESTAMP(' $timestamp')";
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;
}
很好的解释@argon,但是我有一个关于时间戳的问题。
每次当应用程序启用推送通知时,设备令牌将被发送到服务器。我应该从我的服务器中获取时间戳并将其与设备令牌一起持久化,因为didRegisterForRemoteNotificationsWithDeviceToken只提供了deviceToken而没有时间。如果我的服务器运行在不同的时区,而APNS运行在不同的时区,则存储的注册时间(以及设备令牌)无法与从APNS反馈接收到的时间戳进行比较,以检查注册 -> 卸载 -> 重新注册的顺序。
我假设APNS反馈时间戳是UTC时间,服务器存储的时间戳必须在存储ISO时间戳之前转换为UTC时间。这样,两个时间戳将处于相同的时区,并且差异检查将保持一致。
请澄清一下。
@fyasar,
你的建议是将设备令牌存储在设备ID(或某个键)中。当接收到设备令牌的反馈时,从数据库中删除该设备令牌行,对吗?如果我理解正确,在用户在短时间内安装应用程序、卸载它,然后再次安装它并重新注册推送通知之后,只有在所有这些操作完成后才查询反馈服务的情况下,这种方法将无法正常工作。在这种情况下,如果不考虑反馈中的时间戳,则会删除设备令牌,这是不正确的,因为用户已经重新安装了应用程序并重新注册了推送通知。
我的问题是,如苹果文档和许多博客所建议的,在注册时,当设备令牌被持久化时,必须同时持久化时间戳。应该持久化哪个时区的ISO时间,或者反馈服务返回时间戳的时区是什么。