大多数文档建议在启动时注册远程通知,并在收到令牌后,将其推送到具有任何其他应用程序特定设置(例如用户、应用程序内推送设置)的服务器。但是,我不确定如何处理以下极端情况。
如果用户在没有连接的情况下启动应用程序,将不会收到任何令牌。片刻之后,连接恢复。用户尝试更改应用程序中的某些设置,这应该会提示我的服务器发布一个帖子,包括设置和令牌。但是,令牌仍然为零。
相反,每次在尝试发布设置之前注册通知不是更好吗?似乎没有必要在启动时请求此令牌,因为它可能不需要,更糟糕的是,在需要时可能为零。
大多数文档建议在启动时注册远程通知,并在收到令牌后,将其推送到具有任何其他应用程序特定设置(例如用户、应用程序内推送设置)的服务器。但是,我不确定如何处理以下极端情况。
如果用户在没有连接的情况下启动应用程序,将不会收到任何令牌。片刻之后,连接恢复。用户尝试更改应用程序中的某些设置,这应该会提示我的服务器发布一个帖子,包括设置和令牌。但是,令牌仍然为零。
相反,每次在尝试发布设置之前注册通知不是更好吗?似乎没有必要在启动时请求此令牌,因为它可能不需要,更糟糕的是,在需要时可能为零。
我认为最好在应用启动时注册推送通知。当您获得设备令牌时,您不必立即将其发送到您的服务器。您可以将其本地存储在设备上。当您的逻辑需要将设备令牌(以及其他设置)发送到您的服务器时,请获取本地保存的令牌。如果保存的令牌为空,请尝试重新注册,并在获得令牌后将其发送到您的服务器。
请注意,当应用程序启动时,您应该注册推送通知,即使您以前有本地存储的设备令牌(由于 Apple 决定更改设备令牌的可能性很小)。
Apple 建议您每次应用程序进入前台时(无论是打开它还是从后台返回)都应该调用 register。
此调用不仅用作获取推送通知令牌的一种方式,而且还让 Apple 知道此应用程序仍对接收推送通知感兴趣。如果您只调用此方法一次或很少调用此方法并且您不经常发送推送通知,您可能会遇到您一直使用的令牌(存储在服务器上)不再是有效令牌(经过足够多的时间过去了,设备没有确认令牌,苹果将不再认为令牌有效。)