我需要始终知道用户在推送通知设置中选择了哪些选项。
(选项是 - 警报、声音和徽章)
因此,当我的应用启动时,我会致电:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
并检测用户选择了什么。
但是如何检测用户是否在应用程序生命周期的后期更改了设置?
当此设置发生更改时,是否有一些委托方法被调用?
我需要始终知道用户在推送通知设置中选择了哪些选项。
(选项是 - 警报、声音和徽章)
因此,当我的应用启动时,我会致电:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
并检测用户选择了什么。
但是如何检测用户是否在应用程序生命周期的后期更改了设置?
当此设置发生更改时,是否有一些委托方法被调用?
没有代表。您需要定期查询该UIApplication
属性enabledRemoteNotificationTypes
,例如在applicationDidBecomeActive:
.
有关详细信息,请查看以下答案:
在锁定屏幕中查看并启用RemoteNotificationTypes - iOS5
编辑:
如果您需要重置推送通知设置和权限警报,请查看Apple 技术说明 TN2265。在“重置 iOS 上的推送通知权限警报”部分中,他们解释了如何在 iOS 上重置设置。但是,许多开发人员抱怨该程序不起作用。不确定此链接是否有效,您需要访问 Apple 论坛,但它是有关此确切问题的主题之一。
我自己想知道苹果是否已经删除了 iOS 5.1 中的权限对话框。否则他们为什么会要求应用程序显示警报?根据2016 年 6 月之前的 AppStore 审核指南:
5.3未经用户同意就发送推送通知的应用程序将被拒绝
例如,Path(应用程序)要求用户在唱歌过程中选择加入推送通知,而不是在应用程序第一次启动时。
不确定提示的目的是什么,因为应用程序无法查询通知设置的状态。特别是,应用程序可以检查哪些通知类型(使用enabledRemoteNotificationTypes
)已启用,但不能检查特定应用程序的推送通知是否已启用或禁用(顶部的通知中心 ON/OFF 开关)。至少这是 iOS 5.1 中的行为。即使用户禁用了该应用程序的通知,该应用程序仍然可以注册推送通知(使用registerForRemoteNotificationTypes
)并且将收到一个 APNS 令牌。
当您的应用程序变得活跃时检查它,而不仅仅是在启动时。
这是一个通过 UrbanAirship 实现 Push 的例子。每次当用户选择加入/选择退出推送后委托触发时,使用下面的方法,您可以检查(是/否)。
如果不使用 UrbanAirship,也可以使用 UIApplication 委托来实现。
- (void)registrationSucceededForChannelID:(NSString )channelID deviceToken:(NSString )deviceToken
{
NSLog(@"registrationSucceededForChannelID : %@",[self appRegisterForPushNotification]?@"YES":@"NO");
}
- (BOOL)appRegisterForPushNotification {
if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
return ((types & UIUserNotificationTypeAlert) || (types & UIUserNotificationTypeSound));
}
return NO;
}
除了答案@Nick Bull
订阅您敏感的 ViewController 以
UIApplicationWillEnterForegroundNotification
在用户完成设置工作并返回您的应用程序时进行监听:
[[NSNotificationCenter defaultCenter] addObserver: self
selector: @selector(appEnterForeground:)
name: UIApplicationWillEnterForegroundNotification object:nil];
Swift 变体在这里:如何检查用户是否从设置中返回