我正在构建一个针对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 回答
你的
didFailToRegisterForRemoteNotificationsWithError
方法没有失败 - 它甚至从未尝试过,因为用户拒绝了请求 .在iOS7上,您可以做以下几件事:
假设在调用
didRegisterForRemoteNotificationsWithDeviceToken
之前远程通知不可用检查
UIApplication
对象上的值enabledRemoteNotificationTypes
我试图找到绕过同样问题的方法 .
当显示推送通知权限UIAlert时,它会从我的应用程序外部显示 . 一旦用户选择“不允许”或“确定”,我的应用程序将再次变为活动状态 .
在提示用户输入推送权限之前,我有一个视图控制器 . 在这个视图控制器中,我监听
UIApplicationDidBecomeActiveNotification
,然后关闭我的视图控制器 .这一直很好,而我见过的所有其他解决方案根本不适用于我 .
假设您正在针对iOS8或更新版本进行编译,您可以使用以下委托方法:
然后在你的didFinishLaunching(或适合你需要的地方)你必须调用:
此时,系统将提示您的用户使用典型的“允许/不允许”提示消息 . 无论您的用户选择什么,您都可以调用上述方法,从而实现应用程序的细粒度配置 . 结果将是这样的:
在第一种情况下,您会注意到用户拒绝了通知 . 第二个是关于允许选项 .