我正在构建一个针对iOS7和iOS8的应用。我要求用户发送推送通知的权限。但出于某种原因,如果我点击" No" iOS7和iOS8都不会调用我的application:didFailToRegisterForRemoteNotificationsWithError
处理程序。当被要求获得推送许可时。
我的问题:我在iOS7和iOS8上如何知道用户何时驳回推送通知请求 - 我怎么知道他们是否拒绝了请求?
我查看了一堆StackOverflow答案并实施了他们的建议,但它没有按照记录的方式工作:
application:didRegisterForRemoteNotificationsWithDeviceToken:
处理程序。所以我可以告诉他们批准了它。但是,如果用户拒绝该请求,则我不会收到application:didFailToRegisterForRemoteNotificationsWithError
的回调。这似乎是一个错误,我无法告诉用户拒绝了该请求。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,让它再次显示请求提醒。
这是我如何注册推送通知。 {8}分支在iOS8上进行,if
分支在iOS7上进行:
else
(在iOS8中,当调用 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)
}
时,我会调用application:didRegisterUserNotificationSettings:
)。
答案 0 :(得分:7)
我试图找到绕过同样问题的方法。
当显示推送通知权限UIAlert时,它会从我的应用程序外部显示。一旦用户选择“不允许”或“确定”,我的应用程序将再次变为活动状态。
我在提示用户输入推送权限之前有一个我正在呈现的视图控制器。在这个视图控制器中,我监听UIApplicationDidBecomeActiveNotification
,然后关闭我的视图控制器。
这一直运作良好,而我见过的其他所有解决方案根本不适用于我。
答案 1 :(得分:6)
您的didFailToRegisterForRemoteNotificationsWithError
方法未被调用,因为注册没有失败 - 因为用户拒绝了请求,所以甚至都没有尝试过。
在iOS7上,你可以做几件事:
didRegisterForRemoteNotificationsWithDeviceToken
之前远程通知不可用enabledRemoteNotificationTypes
对象UIApplication
醇>
答案 2 :(得分: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);>
在第一种情况下,您会注意到用户拒绝了通知。第二个是关于允许选项。