Saya mencari cara untuk menentukan apakah pengguna, melalui pengaturan, mengaktifkan atau menonaktifkan pemberitahuan push mereka untuk aplikasi saya.
207
Saya mencari cara untuk menentukan apakah pengguna, melalui pengaturan, mengaktifkan atau menonaktifkan pemberitahuan push mereka untuk aplikasi saya.
Panggil enabledRemoteNotificationsTypes
dan periksa topengnya.
Sebagai contoh:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 dan di atasnya:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
dan 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.
[[UIApplication sharedApplication] currentUserNotificationSettings];
Masalah quantumpotato:
Di mana
types
diberikan olehsatu dapat digunakan
dari pada
akan memungkinkan Anda untuk memeriksa hanya apakah notifikasi diaktifkan (dan jangan khawatir tentang suara, lencana, pusat notifikasi, dll.). Baris kode pertama (
types & UIRemoteNotificationTypeAlert
) akan kembaliYES
jika "Alert Style" diatur ke "Banners" atau "Alerts", danNO
jika "Alert Style" diatur ke "None", terlepas dari pengaturan lain.sumber
grantedSettings.types.contains(notificationType)
Dalam versi terbaru iOS, metode ini sekarang sudah tidak digunakan lagi. Untuk mendukung iOS 7 dan iOS 8 gunakan:
sumber
UserNotifications
. Sayangnya, saya tidak memiliki jawaban lengkap sekarang.Kode yang diperbarui untuk swift4.0, iOS11
Kode untuk swift3.0, iOS10
sumber
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".
sumber
Swift 3+
RxSwift Versi Yang Dapat Diamati untuk iOS10 +:
sumber
getNotificationSettings(...)
asinkron sehingga pengembalian di dalam akan diabaikanDalam mencoba mendukung iOS8 dan yang lebih rendah, saya tidak memiliki banyak keberuntungan menggunakan
isRegisteredForRemoteNotifications
seperti yang disarankan Kevin. Sebagai gantinya saya menggunakancurrentUserNotificationSettings
, yang bekerja sangat baik dalam pengujian saya.sumber
isEnabled = NO;
dalamif
kasus Anda tidak diperlukan karena telah diinisialisasi sebagaiNO
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 atauisRegisteredForRemoteNotifications
lebih merupakan jawaban pasti itu sebenarnya tidak.Pertimbangkan ini:
dengan
isRegisteredForRemoteNotifications
status dokumentasi:Namun, jika Anda memasukkan
NSLog
delegasi 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 kembaliYES
. Bahkan mematikannya di pengaturan (notifikasi) masih akan menghasilkan pengembalianYES
ini 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
currentUserNotificationSettings
ini 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
currentUserNotificationSettings
akan kembali:UIUserNotificationTypeNone
dalam hal ini. Ini tidak benar-benar menunjukkan pengaturan aktual pengguna.Beberapa tebakan yang dapat dilakukan:
isRegisteredForRemoteNotifications
iniNO
maka Anda dapat mengasumsikan bahwa perangkat ini tidak pernah berhasil terdaftar untuk pemberitahuan terpencil.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:UIUserNotificationTypeNone
maka 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.sumber
Untuk menyelesaikan jawabannya, ini bisa berfungsi seperti ini ...
sunting: Ini tidak benar. karena ini adalah hal-hal yang bijak, itu tidak akan bekerja dengan saklar, jadi saya akhirnya menggunakan ini:
sumber
Untuk iOS7 dan sebelumnya Anda memang harus menggunakan
enabledRemoteNotificationTypes
dan memeriksa apakah itu sama (atau tidak sama, tergantung pada apa yang Anda inginkan)UIRemoteNotificationTypeNone
.Namun untuk iOS8 tidak selalu cukup hanya dengan memeriksa
isRegisteredForRemoteNotifications
sebanyak mungkin keadaan di atas. Anda juga harus memeriksa apakahapplication.currentUserNotificationSettings.types
sama (atau tidak sama, tergantung pada apa yang Anda inginkan)UIUserNotificationTypeNone
!isRegisteredForRemoteNotifications
mungkin kembali benar meskipuncurrentUserNotificationSettings.types
kembaliUIUserNotificationTypeNone
.sumber
sumber
Di sini kita mendapatkan UIRemoteNotificationType dari aplikasi UIA. Ini mewakili keadaan pemberitahuan push aplikasi ini di pengaturan, daripada Anda dapat memeriksa jenisnya dengan mudah
sumber
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 menggunakanisRegisteredForRemoteNotifications
daripadaenabledRemoteNotificationTypes
yang sudah usang di iOS 8. Di bawah ini adalah solusi saya yang diperbarui yang bekerja sempurna untuk saya:Dan kita dapat memanggil fungsi ini dengan mudah dan mengakses
Bool
nilainya dan dapat mengubahnya menjadi nilai string dengan ini:Semoga ini akan membantu orang lain juga :) Selamat coding.
sumber
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 .
sumber
Solusi Swifty ini bekerja dengan baik untuk saya ( iOS8 + ),
Metode :
Penggunaan :
Ref
sumber
kembali:
ini benar
tetapi mengikuti juga benar! (karena UIRemoteNotificationTypeNone adalah 0)
lihat berikut ini
sumber
Inilah cara melakukannya di Xamarin.ios.
Jika Anda mendukung iOS 10+ hanya gunakan metode UNUserNotificationCenter.
sumber
Di Xamarin, semua solusi di atas tidak bekerja untuk saya. Inilah yang saya gunakan sebagai gantinya:
Ini mendapatkan pembaruan langsung juga setelah Anda mengubah status pemberitahuan di Pengaturan.
sumber
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)
GLHF!
sumber