首页 文章

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

提问于
浏览
16

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

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

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

  • iOS7:如果用户批准了请求,系统会调用我的 application:didRegisterForRemoteNotificationsWithDeviceToken: 处理程序 . 所以我可以告诉他们批准了它 . 但是如果用户拒绝了请求,那么 I don't get a callback to application:didFailToRegisterForRemoteNotificationsWithError . 这似乎是一个错误,我不能告诉用户拒绝了该请求 .

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

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

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

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

这是我如何注册推送通知 . 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)
    }

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

3 回答

  • 7

    你的 didFailToRegisterForRemoteNotificationsWithError 方法没有失败 - 它甚至从未尝试过,因为用户拒绝了请求 .

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

    • 假设在调用 didRegisterForRemoteNotificationsWithDeviceToken 之前远程通知不可用

    • 检查 UIApplication 对象上的值 enabledRemoteNotificationTypes

  • 5

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

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

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

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

  • 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);>
    

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

相关问题