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

Bri*_*rty 17 push-notification apple-push-notifications ios ios7 swift

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

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

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

  • iOS7:如果用户批准了请求,系统调用我的application:didRegisterForRemoteNotificationsWithDeviceToken:处理程序.所以我可以告诉他们批准了它.但是如果用户拒绝请求,那么我就不会收到回调application:didFailToRegisterForRemoteNotificationsWithError.这似乎是一个错误,我不能告诉用户拒绝了该请求.
  • iOS8:如果用户批准或拒绝请求,系统调用我的application:didRegisterUserNotificationSettings处理程序.我可以查看notificationSettings参数以查看用户是否批准或拒绝了我的请求,这样很方便.但是,如果我随后调用isRegisteredForRemoteNotifications()(例如,当应用程序稍后变为活动状态时),它始终返回true - 即使用户已拒绝该请求.所以我得到了误报.这似乎是一个错误,我看到其他人也注意到了这一点.更新:如果我随后打电话let settings = UIApplication.sharedApplication().currentUserNotificationSettings(),我可以查看settings.types是否允许提醒.所以对于iOS8来说,看起来我已经完成了设置.

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

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

在每次测试后重置我的设备,以使其再次显示请求警报.

这是我如何注册推送通知.该if分支采用iOS8,else分支采用iOS7:

    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)
    }
Run Code Online (Sandbox Code Playgroud)

(在iOS8中,当application:didRegisterUserNotificationSettings:被调用时,我随后调用application.registerForRemoteNotifications()).

Mar*_*cus 7

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

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

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

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


Pau*_*w11 6

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

在iOS7上,您可以做以下几件事:

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