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

Posted

技术标签:

【中文标题】为啥每次用户启动应用程序时都要注册推送通知?【英文标题】:Why registering for push notifications every time a user launch an app?为什么每次用户启动应用程序时都要注册推送通知? 【发布时间】:2010-11-07 10:53:24 【问题描述】:

在 Apple 文档中,您可以找到以下句子

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

因此,当我在我的应用程序中实现推送通知时,我必须注册设备,并且我按照他们在该文档中所说的做了:每次用户启动我的应用程序时都进行注册。 对于给定的用户,我从 APNS 收到的令牌始终相同。

我的问题是:如果 APNS 总是给我相同的令牌,为什么我每次都需要注册?

如果用户滑动他的 iPhone 或应用程序,我在某处阅读了令牌可以更改的内容。这是唯一的情况吗?

谢谢!

【问题讨论】:

【参考方案1】:

对于给定的用户,我从 APNS 收到的令牌始终相同。

除非它不是,基本上是因为在 iPhone 设置中作为“用户”没有什么可以坚持的。每个设备的每个应用程序的设备令牌始终相同。因此,同一设备上的不同应用程序会获得不同的令牌。两个不同设备上的同一个应用会获得两个不同的令牌。

需要注意的关键点(在 APNS 指南中提到)是用户可以备份他们的应用程序、设置和所有内容。然后他们可以把手机掉进马桶。当他们拿到替换手机时,他们可以进行备份并将其恢复到新手机上。 Bingo - 相同的应用、相同的用户、不同的设备、和不同的令牌

就您的应用而言,自上次运行以来没有发生任何变化 - 它现在不知道它实际上是在不同的设备上运行。它知道的唯一方法是因为它要求“当前”设备令牌,嘿,这与上次不同。

您可以选择缓存令牌并根据您刚刚收到的令牌检查它(例如,将其保存在您的 NSUserDefaults 中) - 这样您就不必将它传回服务器,除非它自上次运行以来发生了变化,但您绝对必须检查,否则您的用户会抱怨他们更换手机后不再收到推送通知。

【讨论】:

如果您“根据刚刚收到的令牌检查它”,那么为什么不使用新令牌(即使它相同),您已经拨打电话并且已经收到了新令牌.. 我认为您误解了“使用”在这种情况下的含义。 app 正在检查它刚刚从 APNS 调用返回的令牌与存储在本地首选项中的内容。这很便宜,并且不涉及任何网络访问或联系您的服务器。就服务器而言,没有任何变化,所以它不需要知道。如果令牌已更改,那么服务器绝对确实需要知道,因为下次它需要使用不同的令牌发送推送通知.. @MrCranky 但是我怎么知道令牌已经改变了。我知道获取设备令牌的唯一方法是调用registerForRemoteNotifications,然后该调用向服务器发出请求[并同步内容(我想)]。 registerForRemoteNotifications 与设备上的推送通知服务对话,而不是您自己的服务器。这不必涉及网络访问。您可以通过在启动应用程序之前将手机置于飞行模式来测试这一点。如果我没记错的话,您仍然会收到带有令牌的响应,因为在过去的某个时候,设备将与 Apple 的服务器协商其令牌是什么,并且该令牌不会因为您当前处于离线状态而改变.如果检测到新令牌,您应该将新令牌发送到您的服务器,如果不能立即重试,请定期重试。

以上是关于为啥每次用户启动应用程序时都要注册推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AppDelegate 之外注册推送通知?

如果禁用 SNS 端点,为啥 SNS 无法发送推送通知?

打开 PWA 时收到推送事件时不显示通知

Firebase 推送通知 iOS:未注册。为啥?

使用极光/友盟推送,APP进程杀死后为啥收不到推送

在 React Native 中更新推送通知令牌