Check if Local Notifications are enabled in IOS 8
Asked Answered
L

8

32

I've looked all over the internet for how to create local notifications with IOS 8. I found many articles, but none explained how to determine if the user has set "alerts" on or off. Could someone please help me!!! I would prefer to use Objective C over Swift.

Leschen answered 26/9, 2014 at 4:18 Comment(0)
D
76

You can check it by using UIApplication 's currentUserNotificationSettings

if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){ // Check it's iOS 8 and above
    UIUserNotificationSettings *grantedSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

    if (grantedSettings.types == UIUserNotificationTypeNone) {
        NSLog(@"No permiossion granted");
    }
    else if (grantedSettings.types & UIUserNotificationTypeSound & UIUserNotificationTypeAlert ){
        NSLog(@"Sound and alert permissions ");
    }
    else if (grantedSettings.types  & UIUserNotificationTypeAlert){
        NSLog(@"Alert Permission Granted");
    }
}

Hope this helps , Let me know if you need more info

Dissolvent answered 26/9, 2014 at 5:32 Comment(7)
this works great. If the user previously denied permissions the type == none but asking it again wont bring up the request window. How can I know if they previously denied it? Should I keep a flag in user preferences if I asked already?Oina
Note, that it is available on iOS 8+ only.Fabiolafabiolas
Note, this only determines if it is enabled, not explicitly disabled.Coquito
@jasonmccreary How do you mean exactly? How can it be enabled if its explicitly disabled? I thinking Im having this issue. I used the above code in this thread, but I do not get the wanted effect at all. I have made a thread: #33767346Dail
Shouldn't the second if be something like if (grantedSettings.types & (UIUserNotificationTypeSound | UIUserNotificationTypeAlert))since the bitwise comparation between 7* (111) & 2 (010) & 4 (100) will result in 0. 7 is all permissionsBaskin
further to what Benjamin said - (grantedSettings.types & UIUserNotificationTypeSound & UIUserNotificationTypeAlert) will NEVER be trueThreecolor
I know the question asks for Objective-C, but adding a Swift version of your answer could also be helpful :)Pillow
I
23

To expand on Albert's answer, you are not required to use rawValue in Swift. Because UIUserNotificationType conforms to OptionSetType it is possible to do the following:

if let settings = UIApplication.shared.currentUserNotificationSettings {
    if settings.types.contains([.alert, .sound]) {
        //Have alert and sound permissions
    } else if settings.types.contains(.alert) {
        //Have alert permission
    }
}

You use the bracket [] syntax to combine option types (similar to the bitwise-or | operator for combining option flags in other languages).

Implement answered 1/10, 2015 at 4:36 Comment(2)
If you just want to know if the user have selected "something" then: let active = settings.types.intersection([.alert, .badge,.sound]).isEmpty == falseAnnabellannabella
Your answer is the best answer Michal Kaluzny +1Sadie
W
9

Swift with guard:

guard let settings = UIApplication.sharedApplication().currentUserNotificationSettings() where settings.types != .None else {
    return
}
Without answered 31/5, 2016 at 10:31 Comment(1)
could you explain what your code does? if != .none { what? } else { what? }Fid
S
9

Here is a simple function in Swift 3 that checks whether at least one type of notification is enabled.

Enjoy!

static func areNotificationsEnabled() -> Bool {
    guard let settings = UIApplication.shared.currentUserNotificationSettings else {
        return false
    }

    return settings.types.intersection([.alert, .badge, .sound]).isEmpty != true
}

Thanks Michał Kałużny for the inspiration.

Shashaban answered 3/4, 2017 at 15:24 Comment(0)
L
7

Edit: Take a look at @simeon's answer.

In Swift, you need to use rawValue:

let grantedSettings = UIApplication.sharedApplication().currentUserNotificationSettings()
if grantedSettings.types.rawValue & UIUserNotificationType.Alert.rawValue != 0 {
    // Alert permission granted
} 
Lonnalonnard answered 14/1, 2015 at 16:47 Comment(2)
Don't use the rawValues, I don't think there's any guarantee they'd never change. As @Implement says, use settings.types.contains(.Alert)Backchat
No idea @ChrisWagner. I took this from a book from Matt Neuburg. I don't do iOS (I was porting an Android app 1 year ago). I've edited the answer to point to simeon's one. Thanks for the downvote anyway :)Lonnalonnard
R
4

Using the @simeon answer Xcode tells me that

'currentUserNotificationSettings' was deprecated in iOS 10.0: Use UserNotifications Framework's -[UNUserNotificationCenter getNotificationSettingsWithCompletionHandler:] and -[UNUserNotificationCenter getNotificationCategoriesWithCompletionHandler:]

so here is the solution using the UNUserNotificationCenter for Swift 4:

UNUserNotificationCenter.current().getNotificationSettings(){ (settings) in

        switch settings.alertSetting{
        case .enabled:

            //Permissions are granted

        case .disabled:

            //Permissions are not granted

        case .notSupported:

            //The application does not support this notification type
        }
    }
Regularize answered 12/2, 2018 at 13:12 Comment(0)
H
3

I think this code is more precise :

if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {

    UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];

    if (types & UIUserNotificationTypeBadge) {
        NSLog(@"Badge permission");
    }
    if (types & UIUserNotificationTypeSound){
        NSLog(@"Sound permission");
    }
    if (types & UIUserNotificationTypeAlert){
        NSLog(@"Alert permission");
    }
}
Houdan answered 21/12, 2015 at 11:4 Comment(1)
Please consider adding a few lines to explain the code.Scrivenor
O
0

Objective C + iOS 10

  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

        switch (settings.authorizationStatus) {
            case UNAuthorizationStatusNotDetermined:

                break;

            case UNAuthorizationStatusDenied:

                break;

            case UNAuthorizationStatusAuthorized:

                break;

            default:
                break;
        }
    }];
Ornstead answered 16/7, 2018 at 12:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.