Сбросить настройки push-уведомлений для приложения

StackOverflow https://stackoverflow.com/questions/2438400

  •  19-09-2019
  •  | 
  •  

Вопрос

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

Диалог (инициированный registerForRemoteNotificationTypes), однако появляется только один раз для каждого приложения.Как сбросить память моего приложения в ОС iPhone.Удаление приложения и повторная установка не помогают.

Это было полезно?

Решение

Техническое примечание TN2265:Устранение неполадок с push-уведомлениями

В первый раз, когда приложение с поддержкой толкания регистрируется для уведомлений, iOS спрашивает пользователя, хотят ли они получить уведомления для этого приложения.Как только пользователь отреагировал на это предупреждение, оно не будет представлено снова, если устройство не будет восстановлено или приложение не удалось в течение как минимум за день.

Если вы хотите имитировать первый запуск вашего приложения, вы можете оставить приложение, удаленным на один день. Вы можете достичь последнего, фактически не ожидая дня, установив системные часы вперед на день или более, полностью выключив устройство, а затем включите устройство.

Обновлять: Как отмечено в комментариях ниже, это решение перестало работать с iOS 5.1.Я бы рекомендовал сообщить об ошибке в Apple, чтобы они могли обновить свою документацию.Текущее решение, похоже, заключается в сбросе содержимого и настроек устройства.

Обновлять: Техническое примечание дополнено новыми действиями, которые корректно работают с iOS 7.

  1. Удалите приложение с устройства.
  2. Полностью выключите устройство и включите его снова.
  3. Откройте «Настройки» > «Основные» > «Дата и время» и установите дату на день или более вперед.
  4. Полностью выключите устройство и снова включите его.

ОБНОВЛЕНИЕ с iOS 9

Простое удаление и переустановка приложения приведет к сбросу статуса уведомления на notDetermined (это означает, что появятся подсказки).

Благодаря ответу Гомфуция ниже:https://stackoverflow.com/a/33247900/704803

Другие советы

Другой просто для тестирования решение этой проблемы — просто изменить идентификатор пакета.Только не забудьте вернуть его обратно, как только закончите!

В iOS 9.0.2 я получаю «уведомление о регистрации push-уведомления» каждый раз, когда удаляю приложение и переустанавливаю его.Это справедливо как для рабочих загрузок AppStore, так и для специального режима.

ОБНОВЛЯТЬ: Подтверждено, что это работает для iOS 9.x.

Как уже отмечалось, подход к сбросу состояния уведомлений приложения на устройстве изменен для iOS5 и более новой версии.

Это работает для меня на iOS6:

  • Удалить приложение с устройства
  • Установите дату и время устройства на два дня или больше вперед.
  • Перезагрузите устройство
  • Установите дату и время устройства на два дня или больше вперед.
  • Перезагрузите устройство
  • Установите и запустите приложение еще раз

Однако это приведет только к тому, что снова появится начальное приглашение, но не удалит какие-либо другие элементы, связанные с состоянием push.

Список:/private/var/mobile/Library/RemoteNotification/Clients.plist

...содержит зарегистрированных клиентов для push-уведомлений.Удаление записи вашего приложения приведет к повторному появлению запроса.

Кажется, что выполнение этого программно работает для меня каждый раз.У меня есть сборка со следующей строкой без комментариев:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Я запускаю его каждый раз, когда хочу отменить регистрацию в PN.Возможно, вам придется закрыть приложение явно из списка последних и поиграться с Центром уведомлений в приложении «Настройки», чтобы все сделать правильно.

Кроме того, запрос пользовательского интерфейса с просьбой зарегистрироваться для PN может не отображаться.Не уверен, что это было отключено в какой-либо из последних версий iOS.

Как сказал Янолито, установка даты должна работать:

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

Я заметил на своем устройстве (iPhone 4, iOS 6.1.2) настройку системных часов на день вперед или даже на несколько дней не получилось для меня.Поэтому я назначил дату вперед месяц а потом это сработало, и мое приложение снова показало уведомление.

Надеюсь, это кому-нибудь поможет, у меня может сильно болеть голова!

Я согласен с micmdk..У меня была настроена среда разработки с push-уведомлениями, и мне нужен был способ перезагрузить телефон, чтобы он выглядел как первоначальная установка… и только эти точные шаги помогли мне… требуется ДВЕ перезагрузки устройства:

Из APPLE TECH DOC:

Сброс предупреждения о разрешениях на уведомления Push на iOS В первый раз, когда приложение с поддержкой push регистрируется для уведомлений о PUSH, IOS спрашивает пользователя, хотят ли они получить уведомления для этого приложения.После того как пользователь ответил на это предупреждение, оно больше не отображается, пока устройство не будет восстановлено или приложение не будет удалено в течение как минимум одного дня.

Если вы хотите имитировать первый запуск вашего приложения, вы можете оставить приложение неустановленным на один день.Вы можете добиться последнего, не дожидаясь ни дня, выполнив следующие действия:

  1. Удалите приложение с устройства.

  2. Полностью выключите устройство и включите его снова.

  3. Откройте «Настройки» > «Основные» > «Дата и время» и установите дату на день или более вперед.

  4. Полностью выключите устройство и снова включите его.

Раньше я задавался этим вопросом и пришел к выводу, что на самом деле это неподходящий тестовый пример для моего кода.Я не думаю, что код вашего приложения действительно может определить разницу между тем, кто отклоняет уведомления в первый раз или позже, отключив его в настройках уведомлений iPhone.Это правда, что взаимодействие с пользователем отличается, но оно скрыто внутри вызова RegisterForRemoteNotificationTypes.

Вызов unregisterForRemoteNotifications не удаляет приложение полностью из настроек уведомлений, но удаляет содержимое настроек этого приложения.Таким образом, это по-прежнему не приведет к тому, что диалоговое окно будет представлено пользователю во второй раз при следующем запуске приложения (по крайней мере, не в версии 3.1.3, которую я сейчас тестирую).Но, как я уже сказал выше, вам, вероятно, не стоит об этом беспокоиться.

То же техническое примечание, упомянутое в принятом ответе (TN2265 — Устранение неполадок push-уведомлений) с тех пор было обновлено решение для iOS 5 и выше.

Суммируя:создайте резервную копию и каждый раз восстанавливайте из нее.

В iOS 5 и более поздних версиях сбросьте предупреждение о разрешениях push-уведомлений, восстановив устройство из резервной копии (r.11450187).Вот шаги, которые помогут сделать это эффективно:

  1. Используйте Xcode Organizer, чтобы установить приложение на устройство.Главное — установить приложение в первый раз, не запуская его.
  2. Используйте iTunes для резервного копирования устройства.
  3. Запустите приложение.Будет отображено предупреждение о разрешениях на push-уведомления.
  4. Если вы хотите сбросить оповещение о разрешениях для push-уведомлений, восстановите устройство из резервной копии, созданной на первом шаге.

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

Там не сказано, что вы также можете использовать опцию «Основные -> Сброс -> Удалить все содержимое и настройки» на самом устройстве (iOS 5.x).

В дополнение к ответу ianolito.

Была такая же проблема с приложением, которое я скачал год назад и изначально отказывался от push-уведомлений.Теперь, когда я хочу вернуть push-уведомления, эти шаги помогли мне в бета-версии iOS 7.Не уверен, какие именно точки это вызвали.

  • Закройте и удалите приложение.
  • Зайдите в настройки iCloud и удалите приложение из iCloud.Сделайте это на всех других устройствах, где у вас включено резервное копирование iCloud для приложений.После деактивации и удаления сделайте новую резервную копию.Приложение больше не должно отображаться в резервных копиях.(Возможно, именно поэтому Техническое примечание Apple, описанное ianolito, перестало работать в iOS 5, поскольку iCloud был представлен в iOS 5, и во многих из них включено резервное копирование iCloud для приложений.)
  • Зайдите в настройки времени и установите время более чем на 1 месяц вперед.
  • Выключите iPhone (без сброса).
  • Подождите минуту, включите его снова и снова загрузите приложение.
  • Запустите приложение, и мне снова было представлено диалоговое окно.
  • Снова включите резервное копирование приложения, поскольку оно все еще деактивировано.Исправьте время.

Слава богу, мне не пришлось «Стереть все содержимое и настройки».Возможно, это поможет кому-то.

После нескольких часов поиска и безуспешности приведенных выше предложений это сработало как нельзя лучше для 3.x+.

override func viewDidLoad() {
        super.viewDidLoad()


            requestAuthorization()

}

func requestAuthorization() {

        if #available(iOS 10.0, *) {

            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
                print("Access granted: \(granted.description)")
            }

        } else {
            // Fallback on earlier versions
        }

    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top