为什么每次用户启动应用程序时都要注册推送通知?

19
在苹果的文档中,您可以找到以下句子:

应用程序应在每次启动时注册并向其提供程序提供当前令牌。 它调用registerForRemoteNotificationTypes:来启动注册过程。

因此,当我在我的应用程序中实现推送通知时,我必须注册设备,并按照该文档中所说的进行操作:每次用户启动我的应用程序都要进行注册。从APNS接收到的令牌始终对于给定的用户是相同的。
我的问题是:如果APNS总是提供相同的令牌,为什么我需要每次都进行注册?
我在某个地方读到一个令牌可能会因用户滑动iPhone或应用程序而更改。 这是唯一的情况吗?
谢谢!
1个回答

34
我从APNS收到的令牌对于同一用户总是相同的。
但实际上并非如此,因为在iPhone设置中没有任何可以被视为“用户”的东西。每个应用程序对于每个设备的设备令牌始终相同。同一设备上的不同应用程序会获得不同的令牌。在两个不同设备上运行同一应用程序会获得两个不同的令牌。
关键要注意的一点(这在APNS指南中有提到)是用户可能会备份他们的应用程序、设置和所有内容。然后他们可以把手机掉进马桶里。当他们拿到新手机时,他们可以将备份恢复到新手机上。Bingo-相同的应用程序、相同的用户、不同的设备以及不同的令牌。
就你的应用程序而言,自上一次运行以来没有任何变化——它不知道它实际上正在不同的设备上运行。唯一的区别是因为它要求获取'当前'设备令牌,嘿!现在与上次不同了。
你可以选择缓存令牌并将其与刚刚收到的令牌进行比较(例如,在你的NSUserDefaults中保存它),这样除非自上次运行以来发生了更改,否则你不必将其传回服务器,但你绝对必须进行检查,否则你的用户会抱怨说自从更换了手机后他们再也收不到推送通知了。

如果你“检查它与刚收到的令牌匹配”,那么为什么不直接使用新令牌(即使是相同的),你已经发出了调用并已经收到了新令牌。 - Van Du Tran
2
我认为您误解了此上下文中的“using”含义。该应用程序正在检查刚从APNS调用返回的令牌与本地存储的某些内容是否匹配。这很便宜,并且不涉及任何网络访问或联系您的服务器。就服务器而言,没有任何变化,因此它不需要知道。如果令牌已更改,则服务器绝对需要知道,因为下一次将使用不同的令牌发送推送通知。 - MrCranky
@MrCranky 但是我怎么知道令牌已经改变了呢?我所知道的获取设备令牌的唯一方法就是调用registerForRemoteNotifications,而这个调用会向服务器发出请求[并同步一些东西(我猜测)]。 - meteors
1
registerForRemoteNotifications 与设备上的推送通知服务进行通信,而不是您自己的服务器。这不一定涉及网络访问。您可以在启动应用程序之前将手机设置为飞行模式来测试此功能。如果我没记错的话,即使您当前处于离线状态,您仍将收到一个带有令牌的响应,因为设备在过去的某个时刻已经与苹果的服务器协商了其令牌是什么,而该令牌并不会因为您当前处于离线状态而改变。如果检测到新的令牌,您应该将其发送到您的服务器,并在无法立即发送时定期重试。 - MrCranky

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