检测"允许通知"适用于iOS8的开/关

时间:2014-08-04 04:10:09

标签: ios uilocalnotification ios8

我正在尝试在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];
    }
}

11 个答案:

答案 0 :(得分:22)

自iOS8以来,方法enabledRemoteNotificationTypes已被弃用。

要检查iOS8中的远程通知状态,您可以调用

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
如果用户在“设置”中禁用通知,

将返回NO。 isRegisteredForRemoteNotifications上的Documentation

或者您可以检索所有当前通知设置:

[[UIApplication sharedApplication] currentUserNotificationSettings];
currentUserNotificationSettings

上的

Documentation

答案 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..

希望,这会对你有帮助..