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

173

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

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

Ханно
источник

Ответы:

300

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

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

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

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

Обновление: техническая заметка была обновлена ​​с новыми шагами, которые работают правильно с iOS 7.

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

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

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

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

ianolito
источник
16
Кто-нибудь пробовал это с iOS 5.1? Я выполнил эти шаги точно, и я все еще не могу заставить устройство сбросить его ... Я даже попытался установить часы на моем Mac вперед, прежде чем установить его через XCode.
nrj
1
То же самое ... Я не получил подсказку.
Роб
2
Apple добавила новое требование к руководству по подаче заявок в AppStore, которое использует приложение для отображения подсказки. Это может означать, что автоматическое приглашение было удалено в iOS 5.1. Однако нет API для запроса настроек центра уведомлений, поэтому не уверен, что будет целью запроса в любом случае. Смотрите мой ответ на похожую проблему: stackoverflow.com/questions/10191006/…
Грег
10
Это смешно. Разве Apple не понимает, что разработчики или даже пользователи могут захотеть сбросить эти настройки без использования действительно плохого обходного пути?
Судо
2
Когда я пытаюсь сделать это в симуляторе, я получаю сообщение об ошибке Code = 3010 «Удаленные уведомления не поддерживаются в симуляторе»
Томас Циммер
48

Еще одно решение для тестирования - просто изменить идентификатор вашего пакета. Только не забудьте поменять его обратно, когда закончите!

capikaw
источник
12
Вам также не нужно создавать сертификат для нового идентификатора приложения, чтобы протестировать его?
Тони
1
Это будет работать только в том случае, если вы используете профили инициализации с использованием подстановочных знаков - в противном случае вам потребуется создать профиль для нового пакета.
Зорайр
Даже если вам нужно создать новый профиль, достаточно просто нажать кнопку «Исправить» и подождать несколько секунд - гораздо быстрее, чем пройти через все эти циклы перезагрузки.
Илья
это самое быстрое решение! Это работает довольно хорошо для меня! При изменении вашего bundle_id вы не сможете подписать приложение с теми же «профилями обеспечения». Но не волнуйтесь, в xCode (моя версия 7.1.1), вы можете нажать «исправить это», и он сделает свою работу. Также не забывайте, что он включает в себя «Возможности», где вы можете иметь несколько элементов, которые нужно «исправить» (нажав на кнопку «исправить это»), и тогда он будет работать очень хорошо!
Дам Фа
Этот ответ является законным вариантом, но все же является исправлением для глупой ситуации от Apple. Я не изменяю bundleID и не переключаю часы устройства. В случае необходимости любой разработчик может написать краткий код, показывающий UIAlertView, который запрашивает «Разрешить push-уведомления?» .. Да = вызвать метод регистрации; No = call didFailToRegisterForRemoteNotificationsWithError (и т. Д.) ... это мое собственное решение, мой вынос после прочтения этих вопросов и ответов. Технически, это лучший способ информировать пользователей о конфиденциальности ... ПОЧЕМУ push должен быть включен или не обязателен.
Том Пейс
36

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

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

Genki
источник
1
Я испытываю такое же поведение для iOS 9.x. Я бы порекомендовал вам отредактировать оригинальный ответ, добавив ОБНОВЛЕНИЕ:
Евгений Дубинин
3
В заключение! Больше не нужно удалять приложение, выключать устройство, устанавливать часы на прямое время и делать какие-то глупые вещи вроде этого.
mkeremkeskin
19

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

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

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

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

micmdk
источник
У меня тоже работает на ios7, нужно дважды сменить дату, раз не работает
Нат
1
Спасибо! Это даже работает на iOS 8 (мне пришлось сбросить права на push-уведомления для Twitter.app, потому что у него не было настройки «Значки значков приложения» на панели настроек в Настройках).
gklka
9

Plist: /private/var/mobile/Library/RemoteNotification/Clients.plist

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

Эрик Джонсон
источник
11
бесполезный ответ, если вы разрабатываете для App Store
samvermette
20
Если это возможно для джейлбрейков, разработчики должны иметь возможность делать это на не взломанном телефоне, верно? И это НЕ бесполезный ответ, потому что это не то, что вы бы добавили в приложение для отправки в магазин. Это для разработчиков делать во время тестирования.
Оскар
1
Этот файл не является частью iOS 5.x.
gmogames
Смотрите обновленный ответ как часть этого вопроса: stackoverflow.com/questions/13021066/…
AriX
7

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

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

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

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

dagnytaggart
источник
У меня работал iOS 10 / iPhone 6S. Обратите внимание, что я незарегистрированный, затем удалил приложение перед переустановкой.
Габриэль Дженсен
5

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

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

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

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

Винсент Коэн
источник
1
Пожалуйста, не отвечайте «Последняя версия ОС» - она ​​постоянно меняется. Это поведение все еще не работает в 6.1.2, но, возможно, оно работало в 6.0.1?
patr1ck
Отредактировал ответ, по-прежнему есть это в 6.1.2 да и до 6.0.1 тоже. Это работает только для меня, если я по крайней мере установить дату +1 месяц.
Винсент Коэн
1
Я также услышал 24-часовую вещь, поэтому попробовал ее, и она не работала, делая 2 дня вперед. Установите его как 3 месяца спустя, и всплывающее окно с разрешением появилось снова! Спасибо!
марта
Старый пост, но рад видеть, что он все еще помогает! Удачи :)
Винсент Коэн
5

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

Из APPLE TECH DOC:

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

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

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

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

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

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

lepert
источник
Это было упомянуто как больше не работает в другом ответе.
Бо Нувель
Работает просто отлично. То, что перестало работать в iOS 5.1, это старая версия этого другого ответа, которая исключала перезагрузку между удалением приложения и настройкой часов.
dgatwood
3

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

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

Харрисон
источник
Я надеялся на лучший ответ, но я думаю, что просто не один. Спасибо, в любом случае!
Hanno
3

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

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

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

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

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

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

Мистер Зистем
источник
1
Для чего это стоит: я просто попытался «стереть все настройки», и это не сработало. Попробовать все-содержимое-и-все-настройки ...
Groxx
8
И "весь контент и настройки" действительно работает, спасибо! Но святой ядерный вариант, Бэтмен! Это абсолютно безумно.
Groxx
94
Я слышал, что покупка нового устройства также снимает предупреждение о push-уведомлениях!
Самверметт
Я пытался купить новое устройство, но это тоже не сработало. После того, как новое устройство было перенесено в гениальную планку, они поработали над магией и исправили больше денег ... Я удивлен, что после стольких лет Apple до сих пор не предоставил практичный и простой способ сброса разрешений push. Это смешно
Крис
1

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

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

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

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

Masa
источник
1

Я недавно столкнулся с подобной проблемой с реакцией родного приложения. Версия iPhone OS была 13,1 Я удалил приложение и попытался установить приложение и заметил, что и местоположение, и разрешения на уведомления не запрашивались.

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

Проблема была решена только после установки времени устройства.

RUppal
источник
0

После нескольких часов поисков, и без удачи с предложениями выше, это сработало как прелесть для 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
        }

    }
Felecia Genet
источник