如何以编程方式确定推送通知状态?

Posted

技术标签:

【中文标题】如何以编程方式确定推送通知状态?【英文标题】:How to determine Push notification status programmatically? 【发布时间】:2012-01-30 17:19:09 【问题描述】:

在我的应用程序中,对于第一次推送通知注册,我调用didRegisterForRemoteNotificationsWithDeviceToken 并将设备令牌持久保存,并更新我的服务器列表以获取设备令牌。现在,如果有人从 iPhone 设置中关闭推送通知设置,我如何从我的应用程序中确定它,以便我也可以从服务器中删除设备令牌。我知道 APNS 提供了一个反馈列表,但除此之外,还有没有办法在 App 中以编程方式确定它?感谢您的帮助!

【问题讨论】:

【参考方案1】:

我相信您不想以这种方式管理令牌。

您的应用应始终要求 Apple 提供 APNs 令牌。然后,您应该始终将该令牌发送到您自己的服务器,可能会将令牌与您的用户相关联(如果您有的话)。您这样做是因为令牌可能发生变化,因此您要确保始终拥有最新的令牌。

反馈服务会告诉您(实际上,您会在您选择的某个时间间隔内对其进行轮询)哪些令牌已失效。此时,您从服务器端数据库中删除令牌。需要明确的是,您需要一个服务器端进程来轮询 Apple 的反馈服务,然后更新您的服务器端数据库。

在您尝试使用令牌发送通知之前,您不会收到有关无效令牌的反馈。当您发送通知时(我相信)Apple 会接受该通知,但是当 Apple 发现它是针对无效令牌时,该消息将被丢弃,并将令牌添加到您的反馈中。

现在,如果您的应用的用户在您的应用第一次询问时接受了推送通知,但后来通过您的应用的“设置”应用关闭了通知,您将不会收到任何反馈。据我所知,发生的情况是,您发送到该设备的任何通知都将发送到该设备,但操作系统会丢弃它,从而尊重用户在“设置”应用中为您的应用和通知做出的最终选择。

最后,您可以在应用中调用一个 API,以获取在设备上为您的应用启用了哪些类型的通知的位掩码。这是我为此目的编写的方法;根据需要调整:

+(BOOL)acceptsPushNotifications

    UIRemoteNotificationType mask = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

    return (mask & UIRemoteNotificationTypeAlert) == UIRemoteNotificationTypeAlert;

但我不建议您使用它来决定您的应用是否应该告诉您的服务器从您的数据库中删除令牌。这不是整个 APNs 系统的工作方式......我相信。

【讨论】:

以上是关于如何以编程方式确定推送通知状态?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何使用 fcm 以编程方式发送推送通知

以编程方式了解应用程序是不是可以接收推送通知

未使用 Apple 推送通知设置通知徽章计数 - swift - 以编程方式

以编程方式创建 Azure 推送通知中心

iOS Swift 从推送通知以编程方式导航到某些 ViewController

推送通知如何工作?