我正在开发一种推送架构,需要支持允许多个用户的应用程序。这意味着多个用户可以使用其凭据登录该应用程序。我遇到的问题是,如果用户 A 允许推送通知,然后注销,然后用户 B 登录并开始获取用户 A 的推送通知怎么办?
处理此类事情的最佳实践有哪些?我的一个想法是,您可以记住最后登录的用户,并且只向“登录”用户显示推送通知。您必须在消息负载中发送某种用户上下文,以便可以根据登录用户进行检查。然而,这感觉有点时髦。
还有其他人遇到过这个吗?这似乎是一个非常相关的问题,特别是对于家庭倾向于共享设备的平板电脑而言。
我们通过向 APSN 注册设备、获取设备令牌并通过 ws.token 将其发送到我们的服务器来实现这一点。
在服务器端,设备令牌仅与最后登录的用户相关联。
New app
User A (first ever user) uses IPAD A
Register with APSN, get token
Send token to our servers through ws
Search for token in db, token is new, store it
assign token to USER A
Next user logs into app
Register with APSN, get token
Send token to our servers through ws
Search for token in db, token exists already
Remove connection to USER A
assign token to USER B
SEND Notification to device WITH USERNAME
if username is logged in show it - else dont
仍然不完美,因为它首先发送到主屏幕,所以对所有用户来说
我认为您的建议在多用户应用程序中是可以接受的。在客户端实现这一点比在服务器端实现要简单得多。缺点是会浪费额外的带宽来发送不需要的通知。但绝大多数使用可能是单用户,所以这可能并不重要。
另一种方法是跟踪服务器上登录的用户及其当前的 reg_ids。这可能会更复杂,因为 A 可能在多个设备上登录,然后从设备 1 注销,B 登录到设备 1 等,并且您的服务器必须跟踪所有这些。因此,可能需要另一个表来跟踪“登录用户”与“注册 ID”之间的关系。
如果您讨厌发送不需要的通知,请选择服务器路由。如果您重视“保持简单”原则,请选择客户端路线。
假设您的应用程序的用户可以登录多设备。
我们必须在服务器端制作两个API:
func setUserDeviceNotifyToken(userId: Int, deviceToken: String) {}
func removeUserDeviceNotifyToken(userId: Int, deviceToken: String {}
在您的应用程序端,您必须在每次登录时调用
setUserDeviceNotifyToken
API,并在每次注销时调用 removeUserDeviceNotifyToken
。
在服务器端,您可以通过其
deviceNotificationToken
跟踪每个用户并发送正确设备的通知。
注意:如果您的服务不支持单用户多设备登录,您可以只处理一个
updateUserDeviceNotifyToken
,并通过null
删除用户的设备令牌。
注意2:在调用
removeUserDeviceNotifyToken
API 之前,不要让用户注销。
我知道我有点太晚了,但我想我会与其他人分享我的一些经验。
向多个用户推送通知时,必须确保客户端订阅(侦听)特定队列(在本例中为多个队列)。
例如,对于一个名为
top customers
的群组,移动应用程序应主动监听两个频道:
customer_id
(针对单个用户的目标消息)top-customers
(针对一组用户)通过遵循此设置,应用程序将立即收到在这些渠道中发布的任何消息。