Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如果APNS设备令牌过期怎么办?_Objective C_Push Notification_Apple Push Notifications - Fatal编程技术网

Objective c 如果APNS设备令牌过期怎么办?

Objective c 如果APNS设备令牌过期怎么办?,objective-c,push-notification,apple-push-notifications,Objective C,Push Notification,Apple Push Notifications,根据本论坛帖子,设备令牌可能会过期,或者APN可能会更改设备令牌。我的问题是,如果服务器向苹果发送过期令牌,APN是否会使用过期令牌进行通知?APN可以将此过期令牌用于其他设备吗?我从未遇到过过期的设备令牌,因此我无法根据我的个人经验告诉您。我也不能从苹果的APNS文档中告诉你,因为他们没有回答你的问题(而且我不止一次地阅读了他们所有的APNS文档) 无论您的问题的答案是什么,您的应用程序和服务器都应该能够处理设备令牌过期问题 启动应用程序时,请始终调用registerForRemoteNoti

根据本论坛帖子,设备令牌可能会过期,或者APN可能会更改设备令牌。我的问题是,如果服务器向苹果发送过期令牌,APN是否会使用过期令牌进行通知?APN可以将此过期令牌用于其他设备吗?

我从未遇到过过期的设备令牌,因此我无法根据我的个人经验告诉您。我也不能从苹果的APNS文档中告诉你,因为他们没有回答你的问题(而且我不止一次地阅读了他们所有的APNS文档)

无论您的问题的答案是什么,您的应用程序和服务器都应该能够处理设备令牌过期问题

  • 启动应用程序时,请始终调用
    registerForRemoteNotificationTypes
    ,如果设备令牌与应用程序在该设备上获得的最后一个设备令牌不同,请将其发送到服务器

  • 为使用应用程序的每个设备在服务器中分配另一个唯一标识符。让应用程序将该标识符与设备令牌一起发送到您的服务器。这样,如果设备令牌发生更改,服务器将知道它是现有设备的新设备令牌,而不是安装应用程序的新设备

  • 遵循#1和#2将确保您的服务器将为您最近启动应用程序的每个设备拥有当前设备令牌(在您最近没有启动应用程序的设备上,用户可能不太关心您的应用程序,因此我不确定向他们发送推送通知是否会产生任何影响)

  • 如果您确实向旧设备令牌发送了通知,那么如果它有效,一切都很好。如果没有,您要么会得到无效的令牌错误响应,要么会在反馈服务中得到该设备令牌。在这两种情况下,您都应该停止向该令牌发送通知

  • 我假设APNS不会将过期的令牌重新用于其他设备,但如果它重新使用,您的服务器可以使用我在#2中建议的唯一标识符来识别它。在这种情况下,请确保服务器仅将设备令牌分配给其他设备


  • 问题是这个唯一标识符是如何维护的?如果用户安装/卸载应用程序,此唯一标识符将丢失。如果操作系统更新,此唯一标识符(以及设备令牌,根据上述链接)将丢失。设备中是否有任何唯一的密钥永远不会更改并保持此设备的唯一性?@user960567唯一标识符应存储在一些外部存储器中,卸载应用程序时不会被擦除,在重新安装应用程序时可以重新使用(我知道这在Android上是可能的,但不确定iOS)。我认为苹果不允许你使用设备的唯一密钥。在安卓系统中如何做到这一点?@user960567在安卓系统中,如果你的应用程序具有
    Android.permission.WRITE_external_storage
    权限,你可以在外部存储中创建文件。您可以在
    环境下创建文件夹和文件。getExternalStorageDirectory().getAbsolutePath()
    。如果我有多个帐户用于同一个应用程序,该怎么办?所以在我的服务器中,我必须使用用户id、设备id和设备令牌来创建主键,对吗?服务器将如何清理旧令牌@埃兰