16

我需要始终知道用户在推送通知设置中选择了哪些选项。
(选项是 - 警报、声音和徽章)

因此,当我的应用启动时,我会致电:

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

并检测用户选择了什么。

但是如何检测用户是否在应用程序生命周期的后期更改了设置?
当此设置发生更改时,是否有一些委托方法被调用?

4

4 回答 4

22

没有代表。您需要定期查询该UIApplication属性enabledRemoteNotificationTypes,例如在applicationDidBecomeActive:.

有关详细信息,请查看以下答案:

在 iPhone 上确定用户是否启用了推送通知

在锁定屏幕中查看并启用RemoteNotificationTypes - iOS5

编辑:
如果您需要重置推送通知设置和权限警报,请查看Apple 技术说明 TN2265。在“重置 iOS 上的推送通知权限警报”部分中,他们解释了如何在 iOS 上重置设置。但是,许多开发人员抱怨该程序不起作用。不确定此链接是否有效,您需要访问 Apple 论坛,但它是有关此确切问题的主题之一。

我自己想知道苹果是否已经删除了 iOS 5.1 中的权限对话框。否则他们为什么会要求应用程序显示警报?根据2016 年 6 月之前的 AppStore 审核指南

5.3未经用户同意就发送推送通知的应用程序将被拒绝

例如,Path(应用程序)要求用户在唱歌过程中选择加入推送通知,而不是在应用程序第一次启动时。

不确定提示的目的是什么,因为应用程序无法查询通知设置的状态。特别是,应用程序可以检查哪些通知类型(使用enabledRemoteNotificationTypes)已启用,但不能检查特定应用程序的推送通知是否已启用或禁用(顶部的通知中心 ON/OFF 开关)。至少这是 iOS 5.1 中的行为。即使用户禁用了该应用程序的通知,该应用程序仍然可以注册推送通知(使用registerForRemoteNotificationTypes)并且将收到一个 APNS 令牌。

于 2012-04-17T12:24:55.310 回答
7

当您的应用程序变得活跃时检查它,而不仅仅是在启动时。

于 2012-04-17T12:16:01.310 回答
0

这是一个通过 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;
    }
于 2017-01-03T12:50:19.483 回答
0

除了答案@Nick Bull 订阅您敏感的 ViewController 以 UIApplicationWillEnterForegroundNotification 在用户完成设置工作并返回您的应用程序时进行监听:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(appEnterForeground:)
                                             name: UIApplicationWillEnterForegroundNotification object:nil];

Swift 变体在这里:如何检查用户是否从设置中返回

于 2020-03-03T06:48:29.377 回答