如何处理一个带有APNS的多账户应用程序?

5
我目前在研究一款在线离线支持应用程序,并正在了解 APNS 的使用。当我的应用程序仅处理单个用户时(就像短信一样),理解起来非常容易。
我的理解是,安装到特定设备的每个应用程序都将拥有自己的设备令牌(即使取消注册 APNS 并重新注册后也不会更改)。因此,当用户从不同设备登录时,APNS 以及服务器可以进行识别。
然而,当我尝试实现多帐户应用程序(就像 Facebook 一样,不同的人可以使用同一手机登录)时,出现了一些问题。
当用户 A 登录并且应用程序处于后台状态时,它确实会接收到通知。
但是当用户 A 登出(当手机没有互联网连接时,无法立即更新服务器以删除帐户),然后用户 B 登录时,同时服务器尝试向手机推送用户 A 的通知时,该通知已被手机接收(但那是用户 A 的通知),并且用户 B 将收到该通知(在实际场景中永远不应该发生)。
看来 APNS 无法检查应用程序内的帐户身份验证。
所以,我的问题是:
1. 是否有任何方法可以检查并从手机上删除通知(我已经阅读了 Apple Doc. 并注意到有一个 QoS 存储最后一条通知)? 2. 在使用 APNS 时,如何处理此类身份验证问题的最佳实践?
如果我有任何概念上的误解,请纠正我。希望我的问题不会听起来愚蠢和笨拙,并且没有任何问题重复...
2个回答

3
如果你的应用有“注销”功能(而不是登录新用户),我找不到任何方法停止推送通知,除非让服务器知道用户已经注销。如果没有网络连接,就无法进行适当的注销。如果需要这个功能,你应该验证注销是否成功。用户可以被告知由于无法连接服务器,注销失败了。以下是一个例子:
- 用户A在设备X上登录,该设备具有设备令牌TX。 - 服务器将令牌TX关联到用户A。 - 用户A在设备Y上登录,该设备具有设备令牌TY。 - 服务器将令牌TX和TY关联到用户A。 - 推送消息发送给用户A。 - 服务器向TX和TY发送推送消息。 - 用户A从设备X注销,用户B在设备X上登录。 - 服务器删除令牌TX与用户A的关联。 - 服务器将令牌TX关联到用户B。 - 推送消息发送给用户A。 - 服务器向TY发送推送消息。 - 推送消息发送给用户B。 - 服务器向TX发送推送消息。 - 用户B注销,但没有网络连接。 - 登录失败,用户B仍然登录,接收到对话框“无法注销”。

谢谢!不过,正如我在另一个回答下面的评论中提到的那样,我的应用程序需要离线功能(实际上,我的应用程序是一个以离线为主导的应用程序......所以不能仅仅因为用户没有连接到服务器就提示用户注销失败....看起来很奇怪...)不知道Facebook是如何做到的 Orz - user1516507

2

首先:

用户A如何在没有互联网的情况下退出和登录Facebook?

当用户B登录时,互联网已连接,然后您可以将此设备令牌发送到您的服务器:现在用户B在此设备上。

对于情况:用户B已登录,同时服务器尝试向用户A的手机推送通知

如果应用程序正在运行,则会在以下位置获取APNS通知

application: (UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken: (NSData*)deviceToken

不在设备的通知中心的消息窗口中。

您可以这样做:

1)如果用户A已经登录,则发送本地通知以显示通知。

2)如果其他用户已登录或用户已注销,则不采取任何措施。

希望这有所帮助。如果我理解有误,请告诉我。


谢谢: ), 或许 Facebook 的示例并不那么好笑 xD ,因为我的应用将支持可以在离线模式下完成的功能。 我已经尝试使用 Facebook 应用程序在没有互联网连接的情况下注销,某种程度上它的确为我注销了.__. - user1516507
发送推送通知依赖于在线用户是一个不好的想法。你可以使用本地通知来获得更好的结果。但是,我看到你需要使用APNS。 - CReaTuS
哦!你的意思是,我应该改变我的策略,而不是使用APNS的默认“alert”,而是这样做:服务器仍然要求APNS将通知推送到设备,但不显示任何警报视图或增加徽章数字,而是发送一些用户信息,如“receiver”:“john@gmail.com”,并检查刚刚登录的用户是否为john@gmail.com。如果是,则充分利用本地通知,否则不执行任何操作。 这就是你的意思吗? - user1516507
我的意思是,为什么要使用Apns?您可以使用任何POST、GET请求来检查用户的登录和注销。如果是真实用户,则发送本地通知,24小时后会到达。如果用户注销,您可以轻松取消本地通知并发送新的通知。 - CReaTuS
哈哈,这绝对是避免“bug”的最安全的方法,我真的很钦佩大型开发者如何轻松处理这样的问题... 无论如何,感谢您的建议,它们非常有帮助!=] - user1516507
显示剩余2条评论

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