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

时间:2012-01-30 17:19:10

标签: iphone ios cocoa-touch push-notification devicetoken

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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

现在,如果您的应用的用户在您的应用首次询问时接受推送通知,但稍后会通过应用的“设置”应用关闭通知,则您将无法获得有关该应用的任何反馈。我所知道的是,您发送给该设备的任何通知都将被发送到该设备,但操作系统会将其删除,以便在应用和通知的“设置”应用中尊重用户的最终选择。

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

+(BOOL)acceptsPushNotifications
{
    UIRemoteNotificationType mask = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

    return (mask & UIRemoteNotificationTypeAlert) == UIRemoteNotificationTypeAlert;
}

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