APNS设备令牌与登录/注销系统的结合

6
我有一个iOS应用程序,用户可以使用不同的账户登录和退出。(这些账户特定于我们的服务)。
我还使用APNs将后端服务器推送的通知发送到应用程序,当发生有趣的事情时。
以下情况描述了我的问题:
- 用户A启动应用程序并登录。生成设备令牌并发送到服务器。 - 用户A注销应用程序。 - 用户B登录应用程序。 - 后端服务器向属于用户A的设备发送通知。然而,现在用户B已经登录到该设备。(他们共享相同的设备令牌) - 用户B“接收”通知。(即使对当前帐户无效,手机也会显示通知)
是否有人解决过类似的问题?我可以想到几种解决方案,如:
- 手动刷新设备令牌。(我不知道是否可行) - 接收通知 - 但仅在意图用户登录时显示它。但是,我认为这是不可能的,因为系统负责显示通知而不是我的应用程序。 - 更改后端,以便用户在在线和离线时告诉它,并在离线时不发送通知。 (此解决方案将引起许多问题,我认为它也不能完全解决问题,因此我想避免这种情况)
这些解决方案都不理想,我没有找到更好的解决方案。我认为例如Facebook必须解决了类似的问题,可能还有许多其他问题。
感谢对此的任何意见。
FYI. 我将在Android上面临完全相同的问题,但我选择在Stack Overflow上分开提问。
2个回答

4

你找到解决问题的万能钥匙了吗?我们解决问题的方法如下:

  • A 登录并将其令牌上传到我们的后端,并将其存储在钥匙串(或用户默认设置)中。
  • 如果A 正确退出登录,则使其令牌失效。
  • 如果应用程序被删除,则APNS 将通知我们的后端令牌无效。(当发送通知时)
  • B 登录时,由于令牌已存在于钥匙串(或用户默认设置)中,因此我们会将令牌上传到服务器,然后服务器确保令牌仅属于单个用户。

退出登录时,我们取消注册远程通知,以确保不会收到推送通知。

UIApplication.shared.unregisterForRemoteNotifications()

P.S.:Android 部分更容易,因为您可以通过应用程序的生命周期随时访问令牌,因此无需手动存储。


这大致是我们解决问题的方式。不过我确实错过了 unregisterForRemoteNotifications(),所以非常感谢你! - Joakim

3
第三种解决方案是最好的。当用户注销时,您只需要在后端删除安装对象,并在登录时创建一个新对象。

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