在我的应用程序中,对于第一次推送通知注册,我会调用didRegisterForRemoteNotificationsWithDeviceToken
并持久保存设备令牌,并更新我的服务器列表以获取设备令牌。现在,如果有人从 iPhone 设置中关闭推送通知设置,我如何从我的应用程序中确定它,以便我也可以从服务器中删除设备令牌。我知道 APNS 提供了一个反馈列表,但除此之外,还有其他方法可以在 App 中以编程方式确定它吗?谢谢你的帮助!
1 回答
我相信您不想以这种方式管理令牌。
您的应用程序应始终要求 Apple 提供 APNs 令牌。然后,您应该始终将该令牌发送到您自己的服务器,可能会将令牌与您的用户相关联(如果您有的话)。您这样做是因为令牌可能会更改,因此您要确保始终拥有最新的令牌。
反馈服务会告诉您(实际上,您会在您选择的某个时间间隔内对其进行轮询)哪些令牌已失效。此时,您从服务器端数据库中删除令牌。需要明确的是,您需要一个服务器端进程来轮询 Apple 的反馈服务,然后更新您的服务器端数据库。
在您尝试使用令牌发送通知之前,您不会收到有关无效令牌的反馈。当您发送通知时(我相信)Apple 会接受该通知,但是当 Apple 发现它是针对无效令牌时,该消息将被丢弃,并且该令牌会添加到您的反馈中。
现在,如果您的应用程序的用户在您的应用程序第一次询问它时接受了推送通知,但后来通过您的应用程序的设置应用程序关闭了通知,您将不会收到任何关于它的反馈。据我所知,发生的情况是,您发送到该设备的任何通知都将发送到该设备,但操作系统会丢弃它,从而尊重用户在“设置”应用程序中为您的应用程序和通知做出的最终选择。
最后,您可以在您的应用程序中调用一个 API,以获取在设备上为您的应用程序启用了哪些类型的通知的位掩码。这是我为此目的编写的方法;根据需要调整:
+(BOOL)acceptsPushNotifications
{
UIRemoteNotificationType mask = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
return (mask & UIRemoteNotificationTypeAlert) == UIRemoteNotificationTypeAlert;
}
但我不建议使用它来决定您的应用程序是否应该告诉您的服务器从您的数据库中删除令牌。这不是整个 APNs 系统的工作方式……我相信。