【发布时间】:2015-01-25 12:26:37
【问题描述】:
我正在构建一个针对 iOS7 和 iOS8 的应用程序。我要求用户允许发送推送通知。但是由于某种原因,如果我在请求推送权限时单击“否”,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,让它再次显示请求警报。
以下是我注册推送通知的方式。 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())。
【问题讨论】:
标签: ios ios7 swift push-notification apple-push-notifications