Objective-C - обнаруживать, когда пользователь изменяет настройки уведомлений приложения.

Мне нужно всегда знать, какие параметры пользователь выбирает в настройках push-уведомлений.
(Возможные варианты - предупреждение, звук и значки)

Поэтому, когда мое приложение запускается, я звоню:

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

и определить, что выбрал пользователь.

Но как я могу определить, изменяет ли пользователь настройки позже в течение срока службы приложения?
Есть ли какой-нибудь метод делегата, который вызывается, когда происходит изменение с этими настройками?




Ответы (4)


Нет делегата. Вам необходимо периодически запрашивать свойство UIApplication enabledRemoteNotificationTypes, например, в applicationDidBecomeActive:.

Для получения подробной информации проверьте эти ответы:

Определить на iPhone, включил ли пользователь push-уведомления

Просмотр на экране блокировки и enabledRemoteNotificationTypes - iOS5

Изменить:
Если вам нужно сбросить настройки push-уведомлений и предупреждений о разрешениях, взгляните на Техническое примечание Apple TN2265. В разделе «Сброс уведомления о разрешениях push-уведомлений в iOS» объясняется, как сбросить настройку в iOS. Однако многие разработчики жалуются, что процедура не работает. Не уверен, что эта ссылка будет работать, вам потребуется доступ к форуму Apple , но это одна из тем, посвященных именно этой проблеме.

Мне самому было интересно, может быть, Apple удалила диалоговое окно разрешений в iOS 5.1. Иначе зачем им требовать, чтобы приложение показывало предупреждение? В соответствии с рекомендациями по обзору AppStore до июня 2016 г.:

5.3 Приложения, которые отправляют push-уведомления без предварительного согласия пользователя, будут отклонены.

Например, Path (приложение) просит пользователя выбрать push-уведомление в середине процесса регистрации, а не при первом запуске приложения.

В любом случае не уверен, какова должна быть цель приглашения, поскольку приложение не может запросить состояние настройки уведомления. В частности, приложение может проверять, какие типы уведомлений (с помощью enabledRemoteNotificationTypes) включены, но НЕ, если push-уведомления для конкретного приложения включены или отключены (переключатель ВКЛ / ВЫКЛ Центра уведомлений вверху). По крайней мере, так обстоит дело в iOS 5.1. Даже если пользователь отключит уведомления для этого приложения, приложение все равно может зарегистрироваться для получения push-уведомлений (используя registerForRemoteNotificationTypes) и БУДЕТ получать токен APNS.

person Greg    schedule 17.04.2012
comment
спасибо :) знаете ли вы, что мне делать, чтобы разрешить push для этого всплывающего окна приложения, которое пользователь получает при первом запуске приложения? Мне он нужен для отладки разных сценариев, я пытался удалить приложение и переустановить, но не получил всплывающего окна ... - person Eyal; 17.04.2012
comment
Я отредактировал ответ, включив в него несколько полезных ссылок. Однако многие разработчики жалуются, что описанная Apple процедура не работает. Я никогда не видел диалогового окна разрешения при разработке своего приложения, поэтому я даже не знал о его существовании, пока не прочитал несколько сообщений от других разработчиков. - person Greg; 18.04.2012
comment
Последняя часть неверна, по крайней мере, на iOS 7, enabledRemoteNotificationTypes предназначен только для вашего приложения, и если пользователь установил для уведомлений значение none, вы не получите токен APN. - person jcesarmobile; 01.08.2014
comment
enabledRemoteNotificationTypes всегда дает мне UIRemoteNotificationTypeNone. Любая причина ? - person Brijesh Thakur; 11.11.2014
comment
Если вы видите это в симуляторе, это нормально. Push-уведомления не работают в Симуляторе, поэтому вы не получите токен - person intractve; 16.11.2014
comment
5.3 был удален в июне 2016 года, поэтому я изменил ссылку на ссылку Wayback Machine. - person Cœur; 11.07.2019

Проверяйте его, когда ваше приложение становится активным, а не только при запуске.

person Nick Bull    schedule 17.04.2012

Это пример реализации Push через UrbanAirship. Каждый раз, когда пользователь соглашается / отказывается от push-следующих срабатывает делегат, и с помощью метода ниже этого вы можете проверить (ДА / НЕТ).

То же самое можно сделать с делегатом UIApplication, если не использовать UrbanAirship.

- (void)registrationSucceededForChannelID:(NSString )channelID deviceToken:(NSString )deviceToken
    {
        NSLog(@"registrationSucceededForChannelID : %@",[self appRegisterForPushNotification]?@"YES":@"NO");
    }


    - (BOOL)appRegisterForPushNotification {
        if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {
            UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
            return ((types & UIUserNotificationTypeAlert) || (types & UIUserNotificationTypeSound));
        }
        return NO;
    }
person Venu Gopal Tewari    schedule 03.01.2017

В дополнение к ответу @ Ник Булл подпишите свой чувствительный ViewController на UIApplicationWillEnterForegroundNotification прослушивание, когда пользователь выполнил свою настройку. и вернитесь в свое приложение:

[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(appEnterForeground:)
                                             name: UIApplicationWillEnterForegroundNotification object:nil];

Вариант Swift находится здесь: Как проверить, что пользователь вернулся из настроек

person A. Petrov    schedule 03.03.2020