it-swarm-tr.com

Kullanıcının Push bildirimlerini etkinleştirip etkinleştirmediğini iPhone'da belirleme

Kullanıcının, uygulamam için Push bildirimlerini etkinleştirip devre dışı bırakıp bırakmadığını belirlemek için bir yol arıyorum.

201
Kevin

enabledRemoteNotificationsTypes arayın ve maskeyi kontrol edin.

Örneğin: 

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

iOS8 ve üzeri:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
300
Zac Bowling

Yorum yapamam (yeterince itibar yok), ancak re: quantumpota'nın sorunu:

types tarafından verilen

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

biri kullanabilir

if (types & UIRemoteNotificationTypeAlert)

yerine 

if (types == UIRemoteNotificationTypeNone) 

yalnızca bildirimlerin etkin olup olmadığını kontrol etmenizi sağlar (ve sesler, rozetler, bildirim merkezi vb. için endişelenmeyin). "Uyarı Stili" "Afişler" veya "Uyarılar" olarak ayarlanmışsa, ilk kod satırı (types & UIRemoteNotificationTypeAlert) YES değerini ve "Uyarı Stili" diğer ayarlardan bağımsız olarak "Yok" olarak ayarlanmışsa NO değerini döndürür.

99
Tim Camber

İOS'un son sürümünde bu yöntem artık kullanımdan kaldırılmıştır. Hem iOS 7 hem de iOS 8 kullanımını desteklemek için:

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;
}
53
Kevin Sylvestre

Swift4.0, iOS11 için güncellenmiş kod

import UserNotifications

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

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

Swift3.0, iOS10 için kod

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

İOS9'dan Swift 2.0 UIRemoteNotificationType kullanımdan kaldırıldı, aşağıdaki kodu kullanın

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.

}

push bildirimlerinin etkin olup olmadığını kontrol et

    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
    }
48
ViJay Avhad

Aşağıda hem iOS8 hem de iOS7'yi (ve daha düşük sürümleri) kapsayan eksiksiz bir örnek bulacaksınız. Lütfen, iOS8’den önce "uzak bildirimler devre dışı" ile "sadece kilit ekranında görüntüle etkin" arasında ayrım yapamayacağınızı unutmayın.

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");
33
tilo

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
    }

İOS10 + için RxSwift Gözlenebilir Sürüm:

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()
        }
    }
}
24
Adam Smaka

Hem iOS8'i hem de daha düşükünü desteklemeye çalışırken, Kevin'in önerdiği gibi isRegisteredForRemoteNotifications kullanırken pek şansım yoktu. Bunun yerine, testlerimde harika olan currentUserNotificationSettings işlevini kullandım.

+ (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;
}
17
Shaheen Ghiassy

Maalesef bu çözümlerin hiçbiri gerçekten / sorunu çözmedi çünkü günün sonunda API'ler ilgili bilgileri sağlama konusunda ciddi bir şekilde eksikler. Birkaç tahminde bulunabilirsiniz, ancak currentUserNotificationSettings (iOS8 +) 'ı kullanmak şu anki haliyle soruyu gerçekten yanıtlamak için yeterli değildir. Buradaki çözümlerin çoğu ya bunun ya da isRegisteredForRemoteNotifications'nin daha kesin bir cevap olduğunu gösteriyor gibi görünmese de, aslında değil.

Bunu düşün:

isRegisteredForRemoteNotifications dokümantasyon durumları ile:

Uygulama şu anda uzak bildirimler için kayıtlıysa, sistem genelindeki ayarları dikkate alarak EVET döndürür ...

Ancak, davranışı gözlemlemek için uygulama temsilcinize basit bir NSLog atarsanız, bunun işe yarayacağını umduğumuz gibi davranmadığı açıktır. Aslında bu uygulama/cihaz için aktif hale getirilmiş uzaktan bildirimlerle doğrudan ilgilidir. İlk kez aktive edildiğinde bu daima YES değerini döndürür. Bunları ayarlardan (bildirimlerden) kapatsanız bile, bunun geri dönmesine neden olur YES bunun nedeni, iOS8'den itibaren, bir uygulamanın uzaktan bildirimler için kaydolabileceği ve kullanıcının bildirimleri etkin olmadan cihaza gönderebileceği, ancak Uyarıları yapamayacağıdır , Kullanıcı açmadan, rozetler ve sesler. Sessiz bildirimler, bildirimler kapalı olsa bile yapmaya devam edebileceğiniz bir şeye iyi bir örnektir.

currentUserNotificationSettings, dört şeyden birini gösterir:

Uyarılar açık., Rozetler açık, açık. Ses açık, açık. Yok.

Bu, diğer faktörler veya Bildirim anahtarının kendisi ile ilgili hiçbir şekilde size hiçbir gösterge vermez.

Bir kullanıcı aslında rozetleri, sesi ve uyarıları kapatabilir, ancak yine de kilit ekranında veya bildirim merkezinde görünebilir. Bu kullanıcı hala Push bildirimleri alıyor olmalı ve bunları hem kilit ekranında hem de bildirim merkezinde görebilmelidir. Bildirim anahtarı açık. AMA currentUserNotificationSettings geri dönecektir: bu durumda UIUserNotificationTypeNone. Bu, kullanıcıların gerçek ayarlarının gerçekten göstergesi değildir.

İnsanın yapabileceği birkaç tahmin:

  • isRegisteredForRemoteNotificationsNO ise, bu cihazın uzak bildirimler için hiçbir zaman başarıyla kayıt edilmediğini varsayabilirsiniz.
  • uzaktan bildirimlere ilk kez kaydolduktan sonra, bir kullanıcının ilk kez kaydolduğu için/ olmalıdır bu kullanıcının izin için neyi seçtiğini belirttiğinden, şu anda kullanıcı bildirim ayarlarını içeren application:didRegisterUserNotificationSettings: 'a geri çağrı yapılır. istek. Ayarlar: UIUserNotificationTypeNone dışında başka bir şeye eşitse, Push izni verildi, aksi takdirde reddedildi. Bunun nedeni, uzaktan kayıt işlemine başladığınız andan itibaren kullanıcının yalnızca kabul etme veya reddetme kabiliyetine sahip olması, bir kabul işleminin ilk ayarları kayıt işlemi sırasında ayarladığınız ayarlardır.
15
iYorke

Cevabı tamamlamak için, böyle bir şey işe yarayabilir ...

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

düzenleme: Bu doğru değil. Bunlar biraz akıllıca olduklarından, bir anahtarla çalışmaz, bu yüzden şunu kullandım:

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
UIRemoteNotificationType typesset = (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge);
if((types & typesset) == typesset)
{
    CeldaSwitch.chkSwitch.on = true;
}
else
{
    CeldaSwitch.chkSwitch.on = false;
}
8
pojomx

İOS7 ve öncesinde gerçekten de enabledRemoteNotificationTypes kullanmanız ve UIRemoteNotificationTypeNone ile eşit olup olmadığına (veya ne istediğinize bağlı olmadığına) dikkat edin.

Ancak iOS8 için not her zaman sadece yukarıdaki yukarıdaki isRegisteredForRemoteNotifications ile kontrol etmek için yeterli. Ayrıca application.currentUserNotificationSettings.types 'nin eşit olup olmadığını kontrol etmelisiniz (veya ne istediğine bağlı olarak eşit değil) UIUserNotificationTypeNone!

isRegisteredForRemoteNotifications, currentUserNotificationSettings.typesUIUserNotificationTypeNone değerini döndürse de true değerini döndürebilir.

5
Peter Verhage

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

Burada UIA uygulamalardan UIRemoteNotificationType'ı alıyoruz. Kolayca türünü kontrol edebilirsiniz daha, ayarında bu uygulamanın Push bildirim durumunu temsil eder

4
Hossam Ghareeb

@Shaheen Ghiassy tarafından sağlanan çözümü kullanarak iOS 10 ve üstünü desteklemeye çalışıyorum ancak yoksunluk meselesini enabledRemoteNotificationTypes. Yani, iOS 8'de kullanım dışı olan isRegisteredForRemoteNotifications yerine enabledRemoteNotificationTypes kullanarak bulduğum çözüm. Aşağıda benim için mükemmel bir şekilde çalışan güncellenmiş çözümüm:

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

Ve bu işlevi kolayca çağırabilir ve Bool değerine erişebilir ve bunu şu şekilde dize değerine dönüştürebiliriz:

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

Umarım bu da başkalarına yardım eder:)

4
Irfan

Zac'in cevabı iOS 7'ye kadar tamamen doğru olsa da, iOS 8'in gelmesinden bu yana değişti. Çünkü enableRemoteNotificationTypes , iOS 8'den itibaren kullanımdan kaldırılmıştır. İOS 8 ve sonraki sürümlerinde isRegisteredForRemoteNotifications kullanmanız gerekir.

  • iOS 7 ve öncesi için -> enableRemoteNotificationTypes özelliğini kullanın 
  • iOS 8 ve sonrası için -> isRegisteredForRemoteNotifications öğesini kullanın.
3

Bu Swifty çözümü benim için iyi çalıştı (iOS8 +),

Yöntem

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

Kullanım:

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

Ref

1
Zaid Pathan

Xamarin'de, yukarıdaki tüm çözümler benim için işe yaramıyor ..

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

Ayarlar'daki bildirim durumunu değiştirdikten sonra da canlı bir güncelleme oluyor.

0
mr5

yeniden:

doğru

if (types & UIRemoteNotificationTypeAlert)

ama aşağıdakiler de doğru! (UIRemoteNotificationTypeNone 0 olarak)

if (types == UIRemoteNotificationTypeNone) 

aşağıya bakın

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
0
wavespread

İşte Xamarin.ios'ta bunun nasıl yapılacağı.

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

İOS 10+'yi destekliyorsanız, yalnızca UNUserNotificationCenter yöntemiyle gidin.

0
Sune Kjærgård