Jawaban:
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 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 YES
jika "Alert Style" diatur ke "Banners" atau "Alerts", dan NO
jika "Alert Style" diatur ke "None", terlepas dari pengaturan lain.
grantedSettings.types.contains(notificationType)
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;
}
UserNotifications
. Sayangnya, saya tidak memiliki jawaban lengkap sekarang.
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
}
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");
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()
}
}
}
getNotificationSettings(...)
asinkron sehingga pengembalian di dalam akan diabaikan
Dalam mencoba mendukung iOS8 dan yang lebih rendah, saya tidak memiliki banyak keberuntungan menggunakan isRegisteredForRemoteNotifications
seperti 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;
}
isEnabled = NO;
dalam if
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 atau isRegisteredForRemoteNotifications
lebih merupakan jawaban pasti itu sebenarnya tidak.
Pertimbangkan ini:
dengan isRegisteredForRemoteNotifications
status dokumentasi:
Mengembalikan YA jika aplikasi saat ini terdaftar untuk notifikasi jarak jauh, dengan mempertimbangkan semua pengaturan sistem ...
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 kembali YES
. Bahkan mematikannya di pengaturan (notifikasi) masih akan menghasilkan pengembalian YES
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
ini NO
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.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;
}
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 apakah application.currentUserNotificationSettings.types
sama (atau tidak sama, tergantung pada apa yang Anda inginkan) UIUserNotificationTypeNone
!
isRegisteredForRemoteNotifications
mungkin kembali benar meskipun currentUserNotificationSettings.types
kembali UIUserNotificationTypeNone
.
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;
}
}];
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
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 isRegisteredForRemoteNotifications
daripada enabledRemoteNotificationTypes
yang 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 Bool
nilainya dan dapat mengubahnya menjadi nilai string dengan ini:
NSString *str = [self notificationServicesEnabled] ? @"YES" : @"NO";
Semoga ini akan membantu orang lain juga :) Selamat coding.
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 .
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")
}
}
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
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.
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.
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!