Tentukan pada iPhone jika pengguna telah mengaktifkan pemberitahuan push

Jawaban:

300

Panggil enabledRemoteNotificationsTypesdan periksa topengnya.

Sebagai contoh:

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

iOS8 dan di atasnya:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
Bowling Zac
sumber
19
iOS 5: Ini memeriksa jenis pemberitahuan push yang digunakan aplikasi terlepas dari cuaca aplikasi di pusat notifikasi ponsel Anda atau tidak. Saya menonaktifkan pemberitahuan push untuk aplikasi saya dan masih mendapatkan tipe == 6. Setelah menonaktifkan gaya suara dan peringatan, saya mendapatkan tipe == UIRemoteNotificationTypeNone.
quantumpotato
4
Seperti yang ditunjukkan quantumpotato, jawaban ini tidak lagi menangani semua kasus dan bukan solusi lengkap.
DBD
5
Apa yang terjadi dengan Apple? Saya berharap saya bisa mendengar tanggapan mereka tentang masalah ini. Bagaimana kita bisa mengembangkan aplikasi hebat tanpa mengetahui informasi dasar seperti itu ??
Oded Regev
15
@ZacBowling - solusi untuk iOS 8dan lebih tinggi salah karena memeriksa hanya jika pengguna mendaftar untuk notifikasi jarak jauh. Menurut dokumentasi: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
Jadi menurut saya Anda juga harus memeriksa[[UIApplication sharedApplication] currentUserNotificationSettings];
Apan
99

Masalah quantumpotato:

Di mana typesdiberikan oleh

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

satu dapat digunakan

if (types & UIRemoteNotificationTypeAlert)

dari pada

if (types == UIRemoteNotificationTypeNone) 

akan memungkinkan Anda untuk memeriksa hanya apakah notifikasi diaktifkan (dan jangan khawatir tentang suara, lencana, pusat notifikasi, dll.). Baris kode pertama ( types & UIRemoteNotificationTypeAlert) akan kembali YESjika "Alert Style" diatur ke "Banners" atau "Alerts", dan NOjika "Alert Style" diatur ke "None", terlepas dari pengaturan lain.

Tim Camber
sumber
ini tidak membahas masalah quantumpotato. Dia tidak peduli dengan peringatan saja tetapi menunjukkan bahwa Anda tidak dapat membedakan melalui enabledRemoteNotifications apakah pengguna telah mengaktifkan atau menonaktifkan pengaturan Pusat Pemberitahuan.
Joey
8
Jawaban saya mungkin tidak langsung menjawab "bagaimana menentukan apakah aplikasi ada di Notification Center", tetapi ia menawarkan cara untuk memeriksa apakah pengguna akan menerima notifikasi untuk aplikasi Anda , yang menurut saya merupakan jawaban dalam semangat pertanyaan . Saya rasa tidak mungkin untuk memeriksa yang pertama.
Tim Camber
2
Trik "if (types & UIRemoteNotificationTypeAlert)" sangat bagus.
nembleton
Pastikan Anda mengerti mengapa trik ini berhasil! Operator bitwise sangat berguna, dan bitmasks adalah umum di Cocoa. Lihat stackoverflow.com/a/3427633/1148702
Tim Camber
2
Di Swift2 / XCode7 operasi bitwise gagal dengan kesalahan operator Biner '&' tidak dapat diterapkan pada dua operan 'UIUserNotificationType' . Anda dapat menggunakan konten sebagai gantinyagrantedSettings.types.contains(notificationType)
Philipp Otto
54

Dalam versi terbaru iOS, metode ini sekarang sudah tidak digunakan lagi. Untuk mendukung iOS 7 dan iOS 8 gunakan:

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
sumber
2
Bagaimana dengan notifikasi lokal? iOS 8 sekarang mengharuskan pengguna untuk mengizinkannya. Tapi bagaimana cara mengecek nanti apakah ini diizinkan atau tidak?
Frédéric Adda
@FredA. Periksa UserNotifications. Sayangnya, saya tidak memiliki jawaban lengkap sekarang.
Mazyod
3
di Swift saya tidak bisa melakukan diaktifkan = jenis & UIRemoteNotificationTypeAlert. Kesalahan: tipe tidak bool
grandagile
53

Kode yang diperbarui untuk 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()
}

Kode untuk swift3.0, iOS10

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

Dari iOS9, swift 2.0 UIRemoteNotificationType sudah usang, gunakan kode berikut

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.

}

cukup periksa apakah pemberitahuan push diaktifkan

    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
sumber
33

Di bawah ini Anda akan menemukan contoh lengkap yang mencakup iOS8 dan iOS7 (dan versi yang lebih rendah). Harap dicatat bahwa sebelum iOS8 Anda tidak dapat membedakan antara "notifikasi jarak jauh dinonaktifkan" dan "hanya Tampilan di layar aktif yang diaktifkan".

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
sumber
6
userNotificationSettings.types & UIUserNotificationTypeNone akan selalu salah, karena UIUserNotificationTypeNone adalah topeng bit kosong, itu adalah tidak adanya bit lainnya. untuk None, Anda hanya ingin memeriksa kesetaraan.
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
    }

RxSwift Versi Yang Dapat Diamati untuk 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
sumber
1
kamu menyelamatkan hariku. :)
Chetan Dobariya
1
Terima kasih saya sudah mencari ini selama satu jam.
Chanchal Warde
4
getNotificationSettings(...)asinkron sehingga pengembalian di dalam akan diabaikan
shelll
17

Dalam mencoba mendukung iOS8 dan yang lebih rendah, saya tidak memiliki banyak keberuntungan menggunakan isRegisteredForRemoteNotificationsseperti yang disarankan Kevin. Sebagai gantinya saya menggunakan currentUserNotificationSettings, yang bekerja sangat baik dalam pengujian saya.

+ (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
sumber
Ini tidak berlaku ketika aplikasi baru saja diinstal. Metode ini akan selalu mengembalikan TIDAK, dan izin sembulan untuk pemberitahuan push tidak akan pernah muncul. Dengan demikian, pada pengaturan perangkat, aplikasi tidak akan muncul jika Anda ingin mengubah pengaturan notifikasi untuk aplikasi itu (boleh / tidak boleh). Adakah yang tahu cara mengatasi masalah ini?
tyegah123
Pengaturan pemberitahuan tetap ada meskipun aplikasi dihapus. Jadi, jika aplikasi Anda benar-benar baru, maka metode ini akan berfungsi. Jika aplikasi Anda dihapus tetapi kemudian diinstal ulang, maka izin masih ada di sistem dan Apple tidak akan memberi Anda kesempatan untuk meminta kembali izin.
Shaheen Ghiassy
Saya melihat beberapa kode mubazir: isEnabled = NO;dalam ifkasus Anda tidak diperlukan karena telah diinisialisasi sebagaiNO
Jasper
15

Sayangnya tidak ada solusi yang disediakan yang benar - benar menyelesaikan masalah karena pada akhirnya API sangat kurang dalam hal penyediaan informasi terkait. Anda dapat membuat beberapa tebakan namun menggunakan currentUserNotificationSettings(iOS8 +) tidak cukup dalam bentuk saat ini untuk benar-benar menjawab pertanyaan. Meskipun banyak solusi di sini tampaknya menunjukkan bahwa baik itu atau isRegisteredForRemoteNotificationslebih merupakan jawaban pasti itu sebenarnya tidak.

Pertimbangkan ini:

dengan isRegisteredForRemoteNotificationsstatus dokumentasi:

Mengembalikan YA jika aplikasi saat ini terdaftar untuk notifikasi jarak jauh, dengan mempertimbangkan semua pengaturan sistem ...

Namun, jika Anda memasukkan NSLogdelegasi aplikasi Anda untuk mengamati perilaku itu jelas ini tidak berlaku seperti yang kami perkirakan akan berhasil. Ini sebenarnya berkaitan langsung dengan notifikasi jarak jauh yang telah diaktifkan untuk aplikasi / perangkat ini. Setelah diaktifkan untuk pertama kali, ini akan selalu kembali YES. Bahkan mematikannya di pengaturan (notifikasi) masih akan menghasilkan pengembalian YESini karena, pada iOS8, aplikasi dapat mendaftar untuk notifikasi jarak jauh dan bahkan mengirim ke perangkat tanpa pengguna mengaktifkan notifikasi, mereka hanya mungkin tidak melakukan Peringatan, Lencana dan Suara tanpa pengguna menyalakannya. Notifikasi diam adalah contoh yang baik dari sesuatu yang Anda dapat terus lakukan bahkan dengan notifikasi dimatikan.

Sejauh currentUserNotificationSettingsini menunjukkan satu dari empat hal:

Tanda ada di Lencana ada di Suara ada di Tidak ada di.

Ini sama sekali tidak memberikan indikasi apa pun tentang faktor-faktor lain atau sakelar Pemberitahuan itu sendiri.

Seorang pengguna mungkin sebenarnya mematikan lencana, suara dan peringatan tetapi masih memiliki tampilan di layar kunci atau di pusat notifikasi. Pengguna ini masih harus menerima pemberitahuan push dan dapat melihatnya di layar kunci dan di pusat notifikasi. Mereka mengaktifkan notifikasi. TAPI currentUserNotificationSettingsakan kembali: UIUserNotificationTypeNonedalam hal ini. Ini tidak benar-benar menunjukkan pengaturan aktual pengguna.

Beberapa tebakan yang dapat dilakukan:

  • jika isRegisteredForRemoteNotificationsini NOmaka Anda dapat mengasumsikan bahwa perangkat ini tidak pernah berhasil terdaftar untuk pemberitahuan terpencil.
  • setelah pertama kali mendaftar untuk notifikasi jarak jauh, panggilan balik application:didRegisterUserNotificationSettings:dibuat yang berisi pengaturan pemberitahuan pengguna pada saat ini karena ini adalah pertama kalinya pengguna terdaftar, pengaturan harus menunjukkan apa yang dipilih pengguna dalam hal permintaan izin. Jika pengaturan sama dengan selain dari: UIUserNotificationTypeNonemaka izin push diberikan, jika tidak maka ditolak. Alasan untuk ini adalah bahwa sejak Anda memulai proses pendaftaran jarak jauh, pengguna hanya memiliki kemampuan untuk menerima atau menolak, dengan pengaturan awal penerimaan menjadi pengaturan yang Anda siapkan selama proses pendaftaran.
iYorke
sumber
8

Untuk menyelesaikan jawabannya, ini bisa berfungsi seperti ini ...

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

sunting: Ini tidak benar. karena ini adalah hal-hal yang bijak, itu tidak akan bekerja dengan saklar, jadi saya akhirnya menggunakan ini:

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
UIRemoteNotificationType typesset = (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge);
if((types & typesset) == typesset)
{
    CeldaSwitch.chkSwitch.on = true;
}
else
{
    CeldaSwitch.chkSwitch.on = false;
}
pojomx
sumber
Saya menganggap (untuk situasi saya) pemberitahuan suara sebagai tidak diaktifkan (Karena saya memerlukan teks untuk menganggapnya diaktifkan untuk fungsionalitas aplikasi saya)
pojomx
5

Untuk iOS7 dan sebelumnya Anda memang harus menggunakan enabledRemoteNotificationTypesdan memeriksa apakah itu sama (atau tidak sama, tergantung pada apa yang Anda inginkan) UIRemoteNotificationTypeNone.

Namun untuk iOS8 tidak selalu cukup hanya dengan memeriksa isRegisteredForRemoteNotificationssebanyak mungkin keadaan di atas. Anda juga harus memeriksa apakah application.currentUserNotificationSettings.typessama (atau tidak sama, tergantung pada apa yang Anda inginkan) UIUserNotificationTypeNone!

isRegisteredForRemoteNotificationsmungkin kembali benar meskipun currentUserNotificationSettings.typeskembali UIUserNotificationTypeNone.

Peter Verhage
sumber
5

iOS8 + (TUJUAN 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 Maleakhi
sumber
4
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types & UIRemoteNotificationTypeAlert)
    // blah blah blah
{
    NSLog(@"Notification Enabled");
}
else
{
    NSLog(@"Notification not enabled");
}

Di sini kita mendapatkan UIRemoteNotificationType dari aplikasi UIA. Ini mewakili keadaan pemberitahuan push aplikasi ini di pengaturan, daripada Anda dapat memeriksa jenisnya dengan mudah

Hossam Ghareeb
sumber
3
tolong jelaskan apa yang kode ini lakukan, menulis kode tidak hanya menjawab pertanyaan.
Batty
4

Saya mencoba untuk mendukung iOS 10 dan di atas menggunakan solusi yang disediakan oleh @Shaheen Ghiassy tetapi menemukan masalah kekurangan enabledRemoteNotificationTypes. Jadi, solusi yang saya temukan dengan menggunakan isRegisteredForRemoteNotificationsdaripada enabledRemoteNotificationTypesyang sudah usang di iOS 8. Di bawah ini adalah solusi saya yang diperbarui yang bekerja sempurna untuk saya:

- (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;
}

Dan kita dapat memanggil fungsi ini dengan mudah dan mengakses Boolnilainya dan dapat mengubahnya menjadi nilai string dengan ini:

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

Semoga ini akan membantu orang lain juga :) Selamat coding.

Irfan
sumber
3

Meskipun jawaban Zac sangat benar hingga iOS 7, itu telah berubah sejak iOS 8 tiba. Karena enabledRemoteNotificationTypes telah ditinggalkan sejak iOS 8 dan seterusnya. Untuk iOS 8 dan yang lebih baru, Anda perlu menggunakan isRegisteredForRemoteNotifications .

  • untuk iOS 7 dan sebelumnya -> Gunakan enabledRemoteNotificationTypes
  • untuk iOS 8 dan yang lebih baru -> Gunakan isRegisteredForRemoteNotifications.
Rashmi Ranjan mallick
sumber
2

Solusi Swifty ini bekerja dengan baik untuk saya ( iOS8 + ),

Metode :

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)
        }
    }
}

Penggunaan :

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

Ref

Mohammad Zaid Pathan
sumber
0

kembali:

ini benar

if (types & UIRemoteNotificationTypeAlert)

tetapi mengikuti juga benar! (karena UIRemoteNotificationTypeNone adalah 0)

if (types == UIRemoteNotificationTypeNone) 

lihat berikut ini

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
meluas
sumber
0

Inilah cara melakukannya di Xamarin.ios.

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

Jika Anda mendukung iOS 10+ hanya gunakan metode UNUserNotificationCenter.

Sune Kjærgård
sumber
0

Di Xamarin, semua solusi di atas tidak bekerja untuk saya. Inilah yang saya gunakan sebagai gantinya:

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

Ini mendapatkan pembaruan langsung juga setelah Anda mengubah status pemberitahuan di Pengaturan.

mr5
sumber
-1

Kode copy dan paste penuh mudah dibangun dari solusi @ ZacBowling ( https://stackoverflow.com/a/1535427/2298002 )

ini juga akan membawa pengguna ke pengaturan aplikasi Anda dan memungkinkan mereka untuk segera mengaktifkan

Saya juga menambahkan solusi untuk memeriksa apakah layanan lokasi diaktifkan (dan membawa ke pengaturan juga)

// 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!

rumah kaca
sumber