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

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

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

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

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

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

Ответ 1

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

Для деталей проверьте эти ответы:

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

Вид на экране блокировки и включенные удаленные уведомления Типы - 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.

Ответ 2

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

Ответ 3

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

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

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


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