如果我的服务用户退出我的应用程序时,如何可靠地使设备的推送令牌无效(从我的服务器上删除用户配置文件)?
我在用户配置文件中保留一个包含apns令牌的字符串数组,每当用户在给定设备上启用推送通知时添加一个。
后来我意识到推送令牌对于设备是唯一的,但显然对我的内部用户帐户一无所知,因此如果一个用户注销而另一个用户登录(同一设备),则每个用户都拥有相同的令牌。然后,设备的当前用户获得针对其中任何一个的推送通知。
基本的解决方案是在注销时从用户配置文件中删除设备的令牌,但是我想出了一堆陷阱:
我是否缺少更多边缘案例,我可以使用哪些策略解决这些问题?
答案 0 :(得分:3)
你的问题确实呈现了你可能面临的一些困难局面。我建议您转移或确保推送发送逻辑完全在服务器端:将pushtoken链接到您选择的用户标识符(意味着一个推送令牌确实可以链接到多个用户)。您控制的此标识符是您需要发送推送时的目标帐户标识符。这样,您可以控制哪个用户应该接收通知并根据此标识符检索其pushtoken(与Apple提供的任何设备标识符相比,假设1个设备= 1个用户)。
如果您的用户离线注销,您将无法了解它。您可以向该用户发送通知。如果用户选择对其进行操作,您的应用程序将会打开,此时您可以取消订阅服务器中的用户标识符(因为此时他显然已在线)。
答案 1 :(得分:0)
当您的应用首次在设备上运行时,会生成一个uuid(通用唯一ID)并使用NSUserDefaults将其保存在设备上
NSString * uuid = [[NSUserDefaults standardUserDefaults] objectForKey:@" app_uuid"];
if(uuid == nil){
uuid = [[NSUUID UUID] UUIDString];
[[NSUserDefaults standardUserDefaults] setObject:uuid forKey:@"app_uuid"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
此uuid将用于标识用户正在使用并登录的唯一应用程序实例(如果您希望用户能够登录具有相同用户ID的多个设备)。
然后每次向服务器发送令牌时,都会发送用户ID和app uuid。并在服务器端检查app uuid是否已经存在,如果是,则使用新令牌和用户ID覆盖元组,如果没有创建并保存带有用户ID,令牌和uuid的新元组。
向特定用户发送通知时,获取具有用户ID的所有元组,从中获取令牌并使用这些令牌发送通知。