iOS7和iOS8:如何检测用户何时拒绝推送通知请求

时间:2014-11-27 01:23:27

标签: ios ios7 swift push-notification apple-push-notifications

我正在构建一个针对iOS7和iOS8的应用。我要求用户发送推送通知的权限。但出于某种原因,如果我点击" No" iOS7和iOS8都不会调用我的application:didFailToRegisterForRemoteNotificationsWithError处理程序。当被要求获得推送许可时。

我的问题:我在iOS7和iOS8上如何知道用户何时驳回推送通知请求 - 我怎么知道他们是否拒绝了请求?

我查看了一堆StackOverflow答案并实施了他们的建议,但它没有按照记录的方式工作:

  • iOS7:如果用户批准了请求,系统调用我的application:didRegisterForRemoteNotificationsWithDeviceToken:处理程序。所以我可以告诉他们批准了它。但是,如果用户拒绝该请求,则我不会收到application:didFailToRegisterForRemoteNotificationsWithError 的回调。这似乎是一个错误,我无法告诉用户拒绝了该请求。
  • iOS8:如果用户批准或拒绝请求,系统调用我的application:didRegisterUserNotificationSettings处理程序。我可以查看notificationSettings参数,看看用户是否批准了我的请求,这样很方便。 但是,如果我随后致电isRegisteredForRemoteNotifications()(例如,当应用程序稍后变为活动状态时),它始终返回true - 即使用户拒绝了该请求。所以我得到了误报。这似乎是一个错误,我看到others have noticed this as well更新:如果我随后致电let settings = UIApplication.sharedApplication().currentUserNotificationSettings(),我可以检查settings.types以查看是否允许提醒。所以对于iOS8来说,它看起来像是我所有的设置。

我使用NSUserDefaults布尔值来跟踪我是否已经要求用户授予权限。

我正在使用硬件设备进行测试(带有iOS7的iPhone 4S和带有iOS8的iPhone 5),而不是模拟器。

resetting my device after each test,让它再次显示请求提醒。

这是我如何注册推送通知。 {8}分支在iOS8上进行,if分支在iOS7上进行:

else

(在iOS8中,当调用 let application = UIApplication.sharedApplication() if (application.respondsToSelector("registerUserNotificationSettings:")) { let settings = UIUserNotificationSettings(forTypes: .Badge | .Alert | .Sound, categories: nil ) application.registerUserNotificationSettings(settings) } else { application.registerForRemoteNotificationTypes(.Badge | .Alert | .Sound) } 时,我会调用application:didRegisterUserNotificationSettings:)。

3 个答案:

答案 0 :(得分:7)

我试图找到绕过同样问题的方法。

当显示推送通知权限UIAlert时,它会从我的应用程序外部显示。一旦用户选择“不允许”或“确定”,我的应用程序将再次变为活动状态。

我在提示用户输入推送权限之前有一个我正在呈现的视图控制器。在这个视图控制器中,我监听UIApplicationDidBecomeActiveNotification,然后关闭我的视图控制器。

这一直运作良好,而我见过的其他所有解决方案根本不适用于我。

答案 1 :(得分:6)

您的didFailToRegisterForRemoteNotificationsWithError方法未被调用,因为注册没有失败 - 因为用户拒绝了请求,所以甚至都没有尝试过。

在iOS7上,你可以做几件事:

  1. 假设在调用didRegisterForRemoteNotificationsWithDeviceToken之前远程通知不可用
  2. 检查enabledRemoteNotificationTypes对象
  3. 上的值UIApplication

答案 2 :(得分:2)

假设您正在针对iOS8或更新版本进行编译,您可以使用以下委托方法:

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    print("Notifications status: \(notificationSettings)")
}

然后在你的didFinishLaunching(或适合你需要的地方)你必须调用:

let app = UIApplication.sharedApplication()
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
app.registerUserNotificationSettings(settings)
app.registerForRemoteNotifications()

此时,系统会提示您的用户使用典型的“允许/不允许”提示消息。无论您的用户选择什么,您都可以调用上述方法,从而实现应用程序的细粒度配置。结果将是:

Notification Status: <UIUserNotificationSettings: 0x7fa261701da0; types: (none);>

Notification Status: <UIUserNotificationSettings: 0x7ff032e21dd0; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);>

在第一种情况下,您会注意到用户拒绝了通知。第二个是关于允许选项。