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

时间:2015-12-16 15:01:30

标签: ios apple-push-notifications

我有一个iOS应用程序,用户可以使用不同的帐户登录和注销。 (这些帐户特定于我们的服务)。

我正在使用APN将通知从我的后端服务器推送到应用程序,当发生一些有趣的事情时。

以下方案描述了我的问题:

  • 用户A启动应用程序并登录。生成设备令牌并将其发送到服务器。
  • 用户A退出应用
  • 用户B登录应用
  • 后端服务器向设备发送通知"属于"用户A.但是,用户B现在已登录到该设备。 (它们共享相同的设备令牌)
  • 用户B"收到"通知。 (即电话显示通知,尽管它不适用于当前帐户)。

有没有人解决过类似的问题?我可以想到几个解决方案,例如:

  • 手动刷新设备令牌。 (我不知道是否可能)
  • 接收通知 - 如果有意向的用户登录,只会显示通知。但是,我不认为这是可能的,因为系统负责显示通知,而不是我的应用。
  • 更改后端,以便用户在线和离线时必须告知它,并且在用户离线时不发送通知。 (这个解决方案会引起很多问题,而且我认为它也不会完全有效,所以我想避免这种情况。)

这些解决方案似乎都不是最优的,我还没有找到更好的方法。我认为,例如Facebook必须已经解决了类似的问题,也可能解决了许多其他问题。

感谢您的一些意见。

FYI。我将在Android上遇到完全相同的问题,但我选择在Stack Overflow上分离问题。

2 个答案:

答案 0 :(得分:3)

你找到了问题的灵丹妙药吗? 我们解决问题的方法如下:

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

注销时,我们会从远程通知中取消注册,以确保不会收到推送通知。

UIApplication.shared.unregisterForRemoteNotifications()

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

答案 1 :(得分:2)

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