我正在构建一个针对iOS7和iOS8的应用程序.我要求用户发送推送通知的权限.但出于某种原因,application:didFailToRegisterForRemoteNotificationsWithError如果我在被要求获得推送权限时单击"否" ,iOS7和iOS8都不会调用我的处理程序.
我的问题:我在iOS7和iOS8上如何知道用户何时驳回了推送通知的请求 - 我怎么知道他们是否拒绝了请求?
我已经查看了一堆StackOverflow答案,并已实现了他们的建议,但它没有按照记录的方式工作:
application:didRegisterForRemoteNotificationsWithDeviceToken:处理程序.所以我可以告诉他们批准了它.但是如果用户拒绝请求,那么我就不会收到回调application:didFailToRegisterForRemoteNotificationsWithError.这似乎是一个错误,我不能告诉用户拒绝了该请求.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 { …Run Code Online (Sandbox Code Playgroud)