Określ na iPhonie, czy użytkownik włączył powiadomienia wypychane

Odpowiedzi:

300

Zadzwoń enabledRemoteNotificationsTypesi sprawdź maskę.

Na przykład:

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone) 
   // blah blah blah

iOS8 i nowszy:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
Zac Bowling
źródło
19
iOS 5: Sprawdza, jakiego rodzaju powiadomień wypychanych używa aplikacja, niezależnie od pogody, czy aplikacja znajduje się w centrum powiadomień telefonu. Wyłączyłem powiadomienia wypychane dla mojej aplikacji i nadal mam typy == 6. Po wyłączeniu stylu dźwięku i alertu mam typy == UIRemoteNotificationTypeNone.
quantumpotato,
4
Jak wskazał quantumpotato, ta odpowiedź nie obsługuje już wszystkich przypadków i nie jest kompletnym rozwiązaniem.
DBD
5
Co się dzieje z Apple? Chciałbym usłyszeć ich odpowiedź w tej sprawie. Jak możemy tworzyć świetne aplikacje, nie znając tak podstawowych informacji?
Oded Regev
15
@ZacBowling - rozwiązanie dla iOS 8i wyższych jest złe, ponieważ sprawdza tylko, czy użytkownik zarejestrował się na zdalne powiadomienie. Zgodnie z dokumentacją:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
Apan
5
Więc moim zdaniem powinieneś również sprawdzić[[UIApplication sharedApplication] currentUserNotificationSettings];
Apan
99

problem quantumpotato:

Gdzie typespodano przez

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

można użyć

if (types & UIRemoteNotificationTypeAlert)

zamiast

if (types == UIRemoteNotificationTypeNone) 

pozwoli ci sprawdzić tylko, czy powiadomienia są włączone (i nie martw się dźwiękami, odznakami, centrum powiadomień itp.). Pierwszy wiersz kodu ( types & UIRemoteNotificationTypeAlert) powróci, YESjeśli „Alarm Style” jest ustawiony na „Banery” lub „Alarmy” i NOjeśli „Alarm Style” jest ustawiony na „Brak”, niezależnie od innych ustawień.

Tim Camber
źródło
nie rozwiązuje to problemu quantumpotato. Nie przejmuje się tylko alertami, ale wskazuje, że nie można rozpoznać po włączonymRemoteNotifications, czy użytkownik włączył lub wyłączył ustawienie Centrum powiadomień.
Joey
8
Moja odpowiedź może nie odpowiedzieć bezpośrednio „jak ustalić, czy aplikacja znajduje się w Centrum powiadomień”, ale oferuje sposób sprawdzenia, czy użytkownik będzie otrzymywać powiadomienia o Twojej aplikacji , co według mnie jest odpowiedzią w duchu pytania . Nie sądzę, że można sprawdzić to pierwsze.
Tim Camber
2
Sztuczka „if (types & UIRemoteNotificationTypeAlert)” jest bardzo dobra.
nembleton
Upewnij się, że rozumiesz, dlaczego sztuczka działa! Operatory bitowe są bardzo przydatne, a maski bitowe są powszechne w kakao. Sprawdź stackoverflow.com/a/3427633/1148702
Tim Camber
2
W Swift2 / XCode7 operacja bitowa kończy się niepowodzeniem z błędem Operator binarny „&” nie może być zastosowany do dwóch argumentów „UIUserNotificationType” . Zamiast tego możesz użyć zawieragrantedSettings.types.contains(notificationType)
Philipp Otto
54

W najnowszej wersji iOS ta metoda jest obecnie przestarzała. Aby obsługiwać zarówno iOS 7, jak i iOS 8 użyj:

UIApplication *application = [UIApplication sharedApplication];

BOOL enabled;

// Try to use the newer isRegisteredForRemoteNotifications otherwise use the enabledRemoteNotificationTypes.
if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
    enabled = [application isRegisteredForRemoteNotifications];
}
else
{
    UIRemoteNotificationType types = [application enabledRemoteNotificationTypes];
    enabled = types & UIRemoteNotificationTypeAlert;
}
Kevin Sylvestre
źródło
2
Co z lokalnymi powiadomieniami? iOS 8 wymaga teraz od użytkownika na to pozwolenia. Ale jak później sprawdzić, czy są one dozwolone, czy nie?
Frédéric Adda
@FredA. Sprawdzić UserNotifications. Niestety nie mam teraz pełnej odpowiedzi.
Mazyod
1
@FredA. Oto moje zdanie na ten temat .
Mazyod
3
w Swift nie mogę zrobić włączone = typy i UIRemoteNotificationTypeAlert. Błąd: typy nie są bool
grandagile
53

Zaktualizowany kod dla swift4.0, iOS11

import UserNotifications

UNUserNotificationCenter.current().getNotificationSettings { (settings) in
   print("Notification settings: \(settings)")
   guard settings.authorizationStatus == .authorized else { return }

   //Not authorised 
   UIApplication.shared.registerForRemoteNotifications()
}

Kod dla swift3.0, iOS10

    let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
    if isRegisteredForRemoteNotifications {
        // User is registered for notification
    } else {
        // Show alert user is not registered for notification
    }

W systemie iOS9 swift 2.0 UIRemoteNotificationType jest przestarzały, użyj następującego kodu

let notificationType = UIApplication.shared.currentUserNotificationSettings!.types
if notificationType == UIUserNotificationType.none {
        // Push notifications are disabled in setting by user.
    }else{
  // Push notifications are enabled in setting by user.

}

po prostu sprawdź, czy powiadomienia push są włączone

    if notificationType == UIUserNotificationType.badge {
        // the application may badge its icon upon a notification being received
    }
    if notificationType == UIUserNotificationType.sound {
        // the application may play a sound upon a notification being received

    }
    if notificationType == UIUserNotificationType.alert {
        // the application may display an alert upon a notification being received
    }
ViJay Avhad
źródło
33

Poniżej znajdziesz pełny przykład, który obejmuje zarówno iOS8, jak i iOS7 (i niższe wersje). Należy pamiętać, że przed systemów iOS 8 nie można odróżnić „zdalnych powiadomień niepełnosprawnych” i „tylko View w lockscreen włączoną”.

BOOL remoteNotificationsEnabled = false, noneEnabled,alertsEnabled, badgesEnabled, soundsEnabled;

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // iOS8+
    remoteNotificationsEnabled = [UIApplication sharedApplication].isRegisteredForRemoteNotifications;

    UIUserNotificationSettings *userNotificationSettings = [UIApplication sharedApplication].currentUserNotificationSettings;

    noneEnabled = userNotificationSettings.types == UIUserNotificationTypeNone;
    alertsEnabled = userNotificationSettings.types & UIUserNotificationTypeAlert;
    badgesEnabled = userNotificationSettings.types & UIUserNotificationTypeBadge;
    soundsEnabled = userNotificationSettings.types & UIUserNotificationTypeSound;

} else {
    // iOS7 and below
    UIRemoteNotificationType enabledRemoteNotificationTypes = [UIApplication sharedApplication].enabledRemoteNotificationTypes;

    noneEnabled = enabledRemoteNotificationTypes == UIRemoteNotificationTypeNone;
    alertsEnabled = enabledRemoteNotificationTypes & UIRemoteNotificationTypeAlert;
    badgesEnabled = enabledRemoteNotificationTypes & UIRemoteNotificationTypeBadge;
    soundsEnabled = enabledRemoteNotificationTypes & UIRemoteNotificationTypeSound;
}

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    NSLog(@"Remote notifications enabled: %@", remoteNotificationsEnabled ? @"YES" : @"NO");
}

NSLog(@"Notification type status:");
NSLog(@"  None: %@", noneEnabled ? @"enabled" : @"disabled");
NSLog(@"  Alerts: %@", alertsEnabled ? @"enabled" : @"disabled");
NSLog(@"  Badges: %@", badgesEnabled ? @"enabled" : @"disabled");
NSLog(@"  Sounds: %@", soundsEnabled ? @"enabled" : @"disabled");
tilo
źródło
6
userNotificationSettings.types & UIUserNotificationTypeNone zawsze będzie fałszem, ponieważ UIUserNotificationTypeNone to pusta maska ​​bitowa, to brak innych bitów. dla Brak chcesz po prostu sprawdzić równość.
dberwick
25

Swift 3+

    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { (settings: UNNotificationSettings) in
            // settings.authorizationStatus == .authorized
        })
    } else {
        return UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false
    }

Wersja obserwowalna RxSwift na iOS10 +:

import UserNotifications
extension UNUserNotificationCenter {
    static var isAuthorized: Observable<Bool> {
        return Observable.create { observer in
            DispatchQueue.main.async {
                current().getNotificationSettings(completionHandler: { (settings: UNNotificationSettings) in
                    if settings.authorizationStatus == .authorized {
                        observer.onNext(true)
                        observer.onCompleted()
                    } else {
                        current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in
                            observer.onNext(granted)
                            observer.onCompleted()
                        }
                    }
                })
            }
            return Disposables.create()
        }
    }
}
Adam Smaka
źródło
1
ratujesz mój dzień. :)
Chetan Dobariya
1
Dzięki, szukałem tego przez godzinę.
Chanchal Warde
4
getNotificationSettings(...)jest asynchroniczny, więc powrót do środka zostanie zignorowany
shelll
17

Próbując obsługiwać zarówno iOS8, jak i starsze, nie miałem szczęścia, używając isRegisteredForRemoteNotificationsKevina. Zamiast tego użyłem currentUserNotificationSettings, co działało świetnie w moich testach.

+ (BOOL)notificationServicesEnabled {
    BOOL isEnabled = NO;

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){
        UIUserNotificationSettings *notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

        if (!notificationSettings || (notificationSettings.types == UIUserNotificationTypeNone)) {
            isEnabled = NO;
        } else {
            isEnabled = YES;
        }
    } else {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        if (types & UIRemoteNotificationTypeAlert) {
            isEnabled = YES;
        } else{
            isEnabled = NO;
        }
    }

    return isEnabled;
}
Shaheen Ghiassy
źródło
Nie dotyczy to świeżo zainstalowanej aplikacji. Metoda zawsze zwróci NIE, a wyskakujące zezwolenie na powiadomienia push nigdy się nie pojawi. Dlatego w ustawieniach urządzenia aplikacja nie pojawi się, jeśli chcesz zmienić ustawienia powiadomień dla tej aplikacji (zezwól / zabroń). Czy ktoś ma pomysł na obejście tego problemu?
tyegah123
Ustawienia powiadomień są zachowywane nawet po usunięciu aplikacji. Jeśli więc Twoja aplikacja jest całkowicie nowa, ta metoda będzie działać. Jeśli Twoja aplikacja została usunięta, ale następnie ponownie zainstalowana, uprawnienia są nadal w systemie, a Apple nie zapewni Ci możliwości ponownego zapytania o uprawnienia.
Shaheen Ghiassy
Widzę trochę zbędnego kodu: isEnabled = NO;w twoich ifprzypadkach nie jest potrzebny, ponieważ został zainicjowany jakoNO
Jasper
15

Niestety żadne z tych rozwiązań nie rozwiązało problemu, ponieważ na koniec dnia interfejsów API poważnie brakuje, jeśli chodzi o dostarczanie odpowiednich informacji. Możesz zrobić kilka domysłów, jednak użycie currentUserNotificationSettings(iOS8 +) po prostu nie jest wystarczające w obecnej formie, aby naprawdę odpowiedzieć na pytanie. Chociaż wiele rozwiązań tutaj sugeruje, że albo to alboisRegisteredForRemoteNotifications raczej ostateczna odpowiedź, tak naprawdę nie jest.

Rozważ to:

z isRegisteredForRemoteNotificationsdokumentacją stwierdza:

Zwraca TAK, jeśli aplikacja jest obecnie zarejestrowana do zdalnych powiadomień, biorąc pod uwagę wszelkie ustawienia systemowe ...

Jeśli jednak rzucisz po prostu NSLogdelegata aplikacji, aby obserwować zachowanie, jasne jest, że nie zachowuje się tak, jak się spodziewamy. Odnosi się to bezpośrednio do aktywacji zdalnych powiadomień dla tej aplikacji / urządzenia. Raz aktywowane po raz pierwszy, zawsze wróci YES. Nawet wyłączenie ich w ustawieniach (powiadomieniach) nadal spowoduje ich zwrócenie. YESDzieje się tak, ponieważ od iOS8 aplikacja może rejestrować się w celu otrzymywania powiadomień zdalnych, a nawet wysyłać je na urządzenie bez włączonego powiadomienia użytkownika, po prostu nie może generować alertów, Odznaki i dźwięk bez włączania go przez użytkownika. Ciche powiadomienia są dobrym przykładem czegoś, co możesz robić nawet po wyłączeniu powiadomień.

O ile currentUserNotificationSettingswskazuje na jedną z czterech rzeczy:

Alerty są włączone Odznaki są włączone Dźwięk jest włączony Żadne nie są włączone.

Nie daje to absolutnie żadnych wskazówek na temat innych czynników ani samego przełącznika powiadomień.

Użytkownik może w rzeczywistości wyłączyć odznaki, dźwięk i alerty, ale nadal może wyświetlać się na ekranie blokady lub w centrum powiadomień. Ten użytkownik powinien nadal otrzymywać powiadomienia wypychane i widzieć je zarówno na ekranie blokady, jak iw centrum powiadomień. Mają włączoną funkcję powiadomień. ALE currentUserNotificationSettingswróci: UIUserNotificationTypeNonew takim przypadku. Nie świadczy to o rzeczywistych ustawieniach użytkowników.

Można zgadnąć kilka przypuszczeń:

  • Jeśli isRegisteredForRemoteNotificationstak NO, możesz założyć, że to urządzenie nigdy nie zarejestrowało się pomyślnie dla zdalnych powiadomień.
  • po pierwszej rejestracji zdalnych powiadomień następuje application:didRegisterUserNotificationSettings:w tym momencie oddzwonienie zawierające ustawienia powiadomień użytkownika, ponieważ jest to pierwsza rejestracja użytkownika, ustawienia powinny wskazywać to, co użytkownik wybrał w ramach żądania zezwolenia. Jeśli ustawienia są równe czemuś innemu niż: UIUserNotificationTypeNoneto zezwolenie push zostało udzielone, w przeciwnym razie zostało odrzucone. Powodem tego jest to, że od momentu rozpoczęcia procesu zdalnej rejestracji użytkownik może jedynie zaakceptować lub odrzucić, przy czym początkowe ustawienia akceptacji są ustawieniami ustawionymi podczas procesu rejestracji.
iYorke
źródło
8

Aby uzyskać odpowiedź, może działać mniej więcej tak ...

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
switch (types) {
   case UIRemoteNotificationTypeAlert:
   case UIRemoteNotificationTypeBadge:
       // For enabled code
       break;
   case UIRemoteNotificationTypeSound:
   case UIRemoteNotificationTypeNone:
   default:
       // For disabled code
       break;
}

edycja: To nie w porządku. ponieważ są to rzeczy nieco bitowe, nie będzie działać z przełącznikiem, więc przestałem używać:

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
UIRemoteNotificationType typesset = (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge);
if((types & typesset) == typesset)
{
    CeldaSwitch.chkSwitch.on = true;
}
else
{
    CeldaSwitch.chkSwitch.on = false;
}
pojomx
źródło
Uważam (w mojej sytuacji) powiadomienia dźwiękowe za
wyłączone
5

Na iOS7 i wcześniej powinieneś rzeczywiście użyć enabledRemoteNotificationTypesi sprawdzić, czy jest równy (lub nie jest równy w zależności od tego, czego chcesz) UIRemoteNotificationTypeNone.

Jednak w przypadku iOS8 nie zawsze wystarczy sprawdzić tylko isRegisteredForRemoteNotificationstyle stanów powyżej. Powinieneś również sprawdzić, czy application.currentUserNotificationSettings.typesjest równy (lub nie jest równy w zależności od tego, czego chcesz) UIUserNotificationTypeNone!

isRegisteredForRemoteNotificationsmoże zwrócić wartość true, mimo że currentUserNotificationSettings.typeszwraca UIUserNotificationTypeNone.

Peter Verhage
źródło
5

iOS8 + (CEL C)

#import <UserNotifications/UserNotifications.h>


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

    switch (settings.authorizationStatus) {
          case UNAuthorizationStatusNotDetermined:{

            break;
        }
        case UNAuthorizationStatusDenied:{

            break;
        }
        case UNAuthorizationStatusAuthorized:{

            break;
        }
        default:
            break;
    }
}];
Ofir Malachi
źródło
4
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types & UIRemoteNotificationTypeAlert)
    // blah blah blah
{
    NSLog(@"Notification Enabled");
}
else
{
    NSLog(@"Notification not enabled");
}

Tutaj otrzymujemy UIRemoteNotificationType od UIApplication. Reprezentuje stan powiadomienia wypychanego tej aplikacji w ustawieniu, niż można łatwo sprawdzić jej typ

Hossam Ghareeb
źródło
3
proszę wyjaśnić, co robi ten kod, pisanie kodu nie tylko odpowiada na pytanie.
Batty
4

Staram się wspierać system iOS 10 i nowsze wersje za pomocą rozwiązania dostarczonego przez @Shaheen Ghiassy, ​​ale znajduję problem z deprywacją enabledRemoteNotificationTypes. Tak więc rozwiązanie, które znalazłem, isRegisteredForRemoteNotificationszamiast tego, enabledRemoteNotificationTypesktóre jest przestarzałe w iOS 8. Poniżej znajduje się moje zaktualizowane rozwiązanie, które działało idealnie dla mnie:

- (BOOL)notificationServicesEnabled {
    BOOL isEnabled = NO;
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){
        UIUserNotificationSettings *notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

        if (!notificationSettings || (notificationSettings.types == UIUserNotificationTypeNone)) {
            isEnabled = NO;
        } else {
            isEnabled = YES;
        }
    } else {

        if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
            isEnabled = YES;
        } else{
            isEnabled = NO;
        }
    }
    return isEnabled;
}

Możemy łatwo wywołać tę funkcję i uzyskać dostęp do jej Boolwartości, a następnie przekonwertować ją na wartość ciągu:

NSString *str = [self notificationServicesEnabled] ? @"YES" : @"NO";

Mam nadzieję, że pomoże to również innym :) Szczęśliwego kodowania.

Irfan
źródło
3

Chociaż odpowiedź Zac była całkowicie poprawna do iOS 7, zmieniła się od czasu pojawienia się iOS 8. Ponieważ enabledRemoteNotificationTypes został wycofany z iOS 8 i późniejszych. W systemie iOS 8 i nowszych musisz użyć isRegisteredForRemoteNotifications .

  • dla iOS 7 i wcześniejszych -> Użyj włączonychRemoteNotificationTypes
  • dla iOS 8 i nowszych -> Użyj isRegisteredForRemoteNotifications.
Rashmi Ranjan mallick
źródło
2

To rozwiązanie Swifty działało dobrze dla mnie ( iOS8 + ),

Metoda :

func isNotificationEnabled(completion:@escaping (_ enabled:Bool)->()){
    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { (settings: UNNotificationSettings) in
            let status =  (settings.authorizationStatus == .authorized)
            completion(status)
        })
    } else {
        if let status = UIApplication.shared.currentUserNotificationSettings?.types{
            let status = status.rawValue != UIUserNotificationType(rawValue: 0).rawValue
            completion(status)
        }else{
            completion(false)
        }
    }
}

Zastosowanie :

isNotificationEnabled { (isEnabled) in
            if isEnabled{
                print("Push notification enabled")
            }else{
                print("Push notification not enabled")
            }
        }

Nr ref

Mohammad Zaid Pathan
źródło
0

re:

to jest poprawne

if (types & UIRemoteNotificationTypeAlert)

ale przestrzeganie również jest poprawne! (ponieważ UIRemoteNotificationTypeNone ma wartość 0)

if (types == UIRemoteNotificationTypeNone) 

patrz poniżej

NSLog(@"log:%d",0 & 0); ///false
NSLog(@"log:%d",1 & 1); ///true
NSLog(@"log:%d",1<<1 & 1<<1); ///true
NSLog(@"log:%d",1<<2 & 1<<2); ///true
NSLog(@"log:%d",(0 & 0) && YES); ///false
NSLog(@"log:%d",(1 & 1) && YES); ///true
NSLog(@"log:%d",(1<<1 & 1<<1) && YES); ///true
NSLog(@"log:%d",(1<<2 & 1<<2) && YES); ///true
falowane
źródło
0

Oto jak to zrobić w Xamarin.ios.

public class NotificationUtils
{
    public static bool AreNotificationsEnabled ()
    {
        var settings = UIApplication.SharedApplication.CurrentUserNotificationSettings;
        var types = settings.Types;
        return types != UIUserNotificationType.None;
    }
}

Jeśli wspierasz iOS 10+, korzystaj tylko z metody UNUserNotificationCenter.

Sune Kjærgård
źródło
0

W Xamarin wszystkie powyższe rozwiązania nie działają dla mnie. Właśnie tego używam:

public static bool IsRemoteNotificationsEnabled() {
    return UIApplication.SharedApplication.CurrentUserNotificationSettings.Types != UIUserNotificationType.None;
}

Otrzymuje aktualizację na żywo także po zmianie statusu powiadomienia w Ustawieniach.

mr5
źródło
-1

Pełny łatwy kod do kopiowania i wklejania zbudowany z rozwiązania @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )

Spowoduje to również przejście użytkownika do ustawień aplikacji i umożliwi mu natychmiastowe włączenie

Dodałem również w rozwiązaniu do sprawdzania, czy usługi lokalizacyjne są włączone (i doprowadzają również do ustawień)

// check if notification service is enabled
+ (void)checkNotificationServicesEnabled
{
    if (![[UIApplication sharedApplication] isRegisteredForRemoteNotifications])
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Notification Services Disabled!"
                                                            message:@"Yo don't mess around bro! Enabling your Notifications allows you to receive important updates"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];

        alertView.tag = 300;

        [alertView show];

        return;
    }
}

// check if location service is enabled (ref: https://stackoverflow.com/a/35982887/2298002)
+ (void)checkLocationServicesEnabled
{
    //Checking authorization status
    if (![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied)
    {

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled!"
                                                            message:@"You need to enable your GPS location right now!!"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];

        //TODO if user has not given permission to device
        if (![CLLocationManager locationServicesEnabled])
        {
            alertView.tag = 100;
        }
        //TODO if user has not given permission to particular app
        else
        {
            alertView.tag = 200;
        }

        [alertView show];

        return;
    }
}

// handle bringing user to settings for each
+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    if(buttonIndex == 0)// Cancel button pressed
    {
        //TODO for cancel
    }
    else if(buttonIndex == 1)// Settings button pressed.
    {
        if (alertView.tag == 100)
        {
            //This will open ios devices location settings
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"]];
        }
        else if (alertView.tag == 200)
        {
            //This will open particular app location settings
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        }
        else if (alertView.tag == 300)
        {
            //This will open particular app location settings
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        }
    }
}

GLHF!

szklarnia
źródło