我正在尝试在iOS 8中检测应用的本地通知设置
对于UIUserNotificationSettings
,它会返回7,因为我打开了所有徽章,声音&警报。
在设置中,我关闭"允许通知" ,该应用程序仍然返回我的UIUserNotificationSettings(徽章,声音和警报)7。有没有办法检测"允许Notification
"开关?
- (void)application:(UIApplication *)application
didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
NSLog(@"---notificationSettings.types %d" , notificationSettings.types );
if(notificationSettings.types!=7){
UIAlertView * alert =[[UIAlertView alloc ] initWithTitle:@"Please turn on Notification"
message:@"Go to Settings > Notifications > App.\n Switch on Sound, Badge & Alert"
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles: nil];
[alert show];
}
}
答案 0 :(得分:22)
自iOS8以来,方法enabledRemoteNotificationTypes
已被弃用。
要检查iOS8中的远程通知状态,您可以调用
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
如果用户在“设置”中禁用通知,将返回NO。 isRegisteredForRemoteNotifications
上的Documentation
或者您可以检索所有当前通知设置:
[[UIApplication sharedApplication] currentUserNotificationSettings];
currentUserNotificationSettings
上的答案 1 :(得分:14)
Swift 3 +
let isRegisteredForLocalNotifications = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false
Swift 2.3
let isRegisteredForLocalNotifications = UIApplication.sharedApplication().currentUserNotificationSettings()?.types.contains(UIUserNotificationType.Alert) ?? false
答案 2 :(得分:12)
如果在错误的地方,我为这个答案/评论道歉。我真的很喜欢iOS编程,并且之前从未发布过堆栈溢出。我认为这实际上应该是一个评论,但没有50评级我不被允许。如果解释有点简陋,我也会道歉,但同样,有点新的:)。
我还希望测试用户是否更改了初始请求后我的应用允许/要求的通知。在尝试破译Apple文档之后(Apple的编写者要比我更聪明,或者文档是故意模糊的)并做了一些测试我测试了
的值[[UIApplication sharedApplication] currentUserNotificationSettings].hash.
我相信这会返回一个三位哈希值,其中第一位用于横幅通知,第二位用于声音通知,第三位用于警报通知。
因此...
000 = 0 = no notifications.
001 = 1 = only banner,
010 = 2 = only sound,
011 = 3 = sound and banner, no alert
100 = 4 = only alert notifications
and so on until,
111 = 7 = all notifications on.
如果在“设置”应用中关闭允许通知,也会显示0。 希望这会有所帮助。
答案 3 :(得分:11)
要检查iOS8和iOS9中的远程通知状态,请致电:
// Obj-C
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
// Swift
UIApplication.sharedApplication().isRegisteredForRemoteNotifications
如果您的应用可以接收远程通知,则返回true
。但接收远程通知并不意味着它也会显示给用户。
几乎在所有情况下,请求registerForRemoteNotifications()
都会成功,并且会调用AppDelegate的didRegisterForRemoteNotificationsWithDeviceToken
,它会为您提供设备令牌。然后,该应用可以接收未向用户显示的无声远程通知。例如,您可以在收到此类通知时触发应用程序中的后台进程。
请参阅Documentation。
不仅要向您请求权限的用户接收,还要显示远程通知:
// Swift
let notificatonSettings = UIUserNotificationSettings(forTypes: [.Badge, .Alert, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificatonSettings)
这将显示一个用户可以允许或拒绝您的请求的对话框。他们的决定无动于衷,应用程序仍然可以接收远程通知。
如果用户允许,则调用AppDelegate的didRegisterForRemoteNotificationsWithDeviceToken
。
要检查用户是否允许或拒绝您的请求,或者实际上稍后在iOS设置中更改了通知权限,请致电:
// Obj-C
[[UIApplication sharedApplication] currentUserNotificationSettings];
// Swift
UIApplication.sharedApplication().currentUserNotificationSettings()
请参阅Documentation。
答案 4 :(得分:9)
这应该在您的应用首次启动时起作用,用户将获得一个对话框,检查用户是否拒绝或允许通知,使用:
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings: (UIUserNotificationSettings *)notificationSettings
{
if (notificationSettings.types) {
NSLog(@"user allowed notifications");
[[UIApplication sharedApplication] registerForRemoteNotifications];
}else{
NSLog(@"user did not allow notifications");
// show alert here
}
}
在连续发布时,请使用:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
答案 5 :(得分:2)
您可以控制UIApplication.sharedApplication().currentUserNotificationSettings()
的哈希值。
if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))){
if(UIApplication.sharedApplication().currentUserNotificationSettings().hashValue == 0){
pushNotificationStatus = "false"
} else {
pushNotificationStatus = "true"
}
}
答案 6 :(得分:2)
UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
if(notificationType == UIRemoteNotificationTypeNone)
{
NSLog(@"OFF");
}
else{
NSLog(@"ON");
}
适合我
答案 7 :(得分:2)
Swift 2
在AppDelegate中:
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if (notificationSettings.types == .None){ // User did NOT allowed notifications
}else{ // User did allowed notifications
}
}
来自任何其他ViewController:
if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){
}else{
}
答案 8 :(得分:0)
使用.isRegisteredForRemoteNotifications()
并不起作用(尽管应该如此)。但是,当禁用通知或其中一个类型不存在时,以下代码可以正常工作。
func notificationsAreOk() -> Bool {
let wishedTypes = UIUserNotificationType.Badge |
UIUserNotificationType.Alert |
UIUserNotificationType.Sound;
let application = UIApplication.sharedApplication()
let settings = application.currentUserNotificationSettings()
if settings == nil {
return false
}
if settings.types != wishedTypes {
return false
}
return true
}
编辑:在禁用通知后,某些测试并不总是有效。我正在考虑发送测试通知以了解他们何时工作。
答案 9 :(得分:0)
检查一下。代码经过试用和测试。
ids = [5, 2, 3, 1, 4]
order = Case(*[When(id=id, then=pos) for pos, id in enumerate(ids)])
queryset = MyModel.objects.filter(id__in=ids).order_by(order)
答案 10 :(得分:-5)
您可以使用以下代码检查该用户设置是否启用或禁用推送通知。
启用或禁用Iphone推送通知
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// Yes it is..
希望,这会对你有帮助..