Определите на iPhone, если пользователь включил push-уведомления - PullRequest
205 голосов
/ 08 октября 2009

Я ищу способ определить, включил ли пользователь через настройки свои push-уведомления для моего приложения.

Ответы [ 19 ]

4 голосов
/ 21 августа 2017

Я пытаюсь поддерживать iOS 10 и выше, используя решение, предоставленное @Shaheen Ghiassy, ​​но нахожу проблему депривации enabledRemoteNotificationTypes. Итак, решение, которое я нахожу, используя isRegisteredForRemoteNotifications вместо enabledRemoteNotificationTypes, которое устарело в iOS 8. Ниже приводится мое обновленное решение, которое отлично сработало для меня:

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

И мы можем легко вызвать эту функцию и получить доступ к ее значению Bool и можем преобразовать ее в строковое значение следующим образом:

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

Надеюсь, это поможет и другим :) Удачного кодирования.

4 голосов
/ 09 августа 2017

iOS8 + (ЦЕЛЬ 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 голосов
/ 22 апреля 2014
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types & UIRemoteNotificationTypeAlert)
    // blah blah blah
{
    NSLog(@"Notification Enabled");
}
else
{
    NSLog(@"Notification not enabled");
}

Здесь мы получаем UIRemoteNotificationType из UIApplication. Он представляет состояние push-уведомлений этого приложения в настройках, после чего вы можете легко проверить его тип

3 голосов
/ 15 декабря 2014

Хотя ответ Zac был совершенно верным до iOS 7, он изменился с тех пор, как появилась iOS 8. Потому что enabledRemoteNotificationTypes устарело с iOS 8 и выше. Для iOS 8 и более поздних версий вам необходимо использовать isRegisteredForRemoteNotifications .

  • для iOS 7 и ранее -> Использовать enabledRemoteNotificationTypes
  • для iOS 8 и более поздних версий -> Использовать isRegisteredForRemoteNotifications.
1 голос
/ 21 июля 2017

Это Swifty решение хорошо сработало для меня ( iOS8 + ),

Метод :

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

Использование

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

Ref

0 голосов
/ 21 августа 2017

В Xamarin все вышеперечисленное решение у меня не работает. Это то, что я использую вместо:

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

Он получает живое обновление также после того, как вы изменили статус уведомления в Настройках.

0 голосов
/ 01 августа 2017

Вот как это сделать в Xamarin.ios.

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

Если вы поддерживаете iOS 10+, используйте метод UNUserNotificationCenter.

0 голосов
/ 16 мая 2012

Re:

это правильно

if (types & UIRemoteNotificationTypeAlert)

но следующее тоже верно! (так как UIRemoteNotificationTypeNone равен 0)

if (types == UIRemoteNotificationTypeNone) 

см. Следующее

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 голосов
/ 22 июня 2016

Полностью легкое копирование и вставка кода, созданного на основе решения @ ZacBowling (https://stackoverflow.com/a/1535427/2298002)

это также приведет пользователя к настройкам вашего приложения и позволит немедленно включить его

Я также добавил решение для проверки, включены ли службы определения местоположения (и приводит ли это к настройкам)

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

...