Скинути налаштування натискань сповіщення для програми


173

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

Однак діалог (ініційований registerForRemoteNotificationTypes) відображається лише один раз у програмі. Як відновити пам’ять iPhone OS у своєму додатку. Видалення програми та перевстановлення не допомагають.

Відповіді:


300

Технічна примітка TN2265: Усунення несправностей Push Notifications

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

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

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

Оновлення: технічну записку оновлено новими кроками, які працюють правильно від iOS 7.

  1. Видаліть додаток із пристрою.
  2. Вимкніть пристрій повністю та увімкніть його знову.
  3. Перейдіть у Налаштування> Загальне> Дата та час та встановіть дату на день або більше.
  4. Знову повністю вимкніть прилад та увімкніть його знову.

ОНОВЛЕННЯ станом на iOS 9

Якщо просто видалити та перевстановити додаток, стан сповіщення буде відновлено до notDetermined(тобто з'являться підказки).

Завдяки відповіді Гомфуція нижче: https://stackoverflow.com/a/33247900/704803


16
Хто-небудь пробував цей w / iOS 5.1? Я точно дотримувався цих кроків і досі не можу змусити пристрій його скинути ... Я навіть спробував встановити годинник на своєму Mac вперед, перш ніж встановлювати його через Xcode.
nrj

1
Дітто ... Я не отримав підказки.
Роб

2
Apple додала нову вимогу до вказівок щодо подання додатків AppStore, яка покладається на те, що додаток відображає підказку. Це може говорити про те, що в iOS 5.1 було видалено автоматичне запит. Однак немає API для запиту налаштувань центру сповіщень, тож не переконайтесь, якою буде мета в будь-якому разі. Дивіться мою відповідь на подібне питання: stackoverflow.com/questions/10191006/…
Грег

10
Це смішно. Хіба Apple не усвідомлює, що розробники чи навіть користувачі можуть захотіти скинути ці речі, не використовуючи дійсно поганий спосіб вирішення?
судо

2
Коли я спробую це в тренажері, я отримую код помилки = 3010 "віддалене сповіщення не підтримується в тренажері"
Thomas Zimmer

48

Ще одне лише тестування рішення для цього - проста зміна ідентифікатора пакету. Просто не забудьте змінити його назад, як тільки ви закінчите!


12
Чи вам також не потрібно створювати сертифікат для нового ідентифікатора програми, щоб перевірити його?
Тоні

1
Це спрацює лише в тому випадку, якщо ви використовуєте профілі базування на основі підстановки - інакше вам потрібно буде створити профіль для нового пакету.
Зорайр

Навіть якщо вам потрібно створити новий профіль, це просто натиснути кнопку «Виправити» і чекати кілька секунд - набагато швидше, ніж пройти всі ці цикли перезавантаження.
Ілля

це найшвидше рішення! Це працює досить добре для мене! Під час зміни свого bundle_id ви не зможете підписати додаток з тими ж "профілями резервування". Але не хвилюйтесь, у xCode (моя версія 7.1.1) ви можете натиснути «виправити», і вона зробить роботу. Крім того, не забувайте onglet "Можливості", де ви можете "виправити" кілька елементів (натиснувши кнопку "виправити"), і тоді це буде дуже добре!
Дамба Фа

Ця відповідь є законним варіантом, але все-таки виправленням для нерозумної ситуації від Apple. Я не змінюю ідентифікатор bundleID, ні перемикаю годинник пристрою. У відповідних випадках будь-який розробник може написати короткий код із відображенням UIAlertView із запитом "Дозволити натискання сповіщень?" .. Так = виклик методу реєстрації; Ні = виклик didFailToRegisterForRemoteNotificationsWithError (тощо) .. це моє власне рішення, моє вилучення після прочитання цього запитання. Технічно це найкращий спосіб інформувати користувачів про інформацію про конфіденційність ... ЧОМУ натискання повинно бути включеним чи необов’язковим
Том Пейс

36

У iOS 9.0.2 я отримую "зареєструвати сповіщення про натискання сповіщень" щоразу, коли видаляю додаток і перевстановлюю його. Це справедливо як для завантажень виробництва AppStore, так і для режиму adhoc.

ОНОВЛЕННЯ: Підтверджено, що це працює для iOS 9.x


1
Я відчуваю таку ж поведінку для iOS 9.x. Я рекомендую вам відредагувати оригінальну відповідь, додавши ОНОВЛЕННЯ:
Євген Дубінін

3
Нарешті! Більше не видаляйте додаток, вимикайте пристрій, встановлюйте годинник на час вперед і такі нерозумні речі, як це.
mkeremkeskin

19

Як уже зазначалося, підхід до скидання стану сповіщення для програми на пристрої змінюється на iOS5 на новіший.

Це працює для мене на iOS6:

  • Видаліть додаток із пристрою
  • Встановіть дату пристрою на два дні або більше
  • Перезавантажте пристрій
  • Встановіть дату пристрою на два дні або більше
  • Перезавантажте пристрій
  • Встановіть та запустіть додаток ще раз

Однак це лише зробить початкову підказку знову - вона не видалить будь-які інші дані, пов’язані з натисканням.


Працював і для мене на ios7, ти повинен змінити дату двічі один раз, коли не працює
Nath

1
Дякую! Це працює навіть на iOS 8 (мені довелося скинути дозволи на натискання для Twitter.app, оскільки в панелі налаштувань у налаштуваннях не було налаштування "Значки значків додатків").
gklka

9

Пліст: /private/var/mobile/Library/RemoteNotification/Clients.plist

... містить зареєстрованих клієнтів для push-повідомлень. Якщо видалити запис додатка, це призведе до повторного відображення запиту


11
марна відповідь, якщо ви розробляєте для App Store
samvermette

20
Якщо для джейлбрейків це можливо, розробникам повинно бути можливість робити це на телефоні, що не працює з в'язницею, правда? І це НЕ марна відповідь, адже це не те, що ви додали в додаток для подання в магазин. Це розробники повинні робити тестування.
Оскар

1
Цей файл не є частиною iOS 5.x.
gmogames

Див оновленого відповіді як частина цього питання: stackoverflow.com/questions/13021066 / ...
Арікс

7

Зробити це програмно, здається, працює для мене кожен раз. У мене збірка із наступним рядком без коментарів:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

Я запускаю його щоразу, коли хочу скасувати реєстрацію від PN. Можливо, вам доведеться явно закінчити додаток зі списку одержувачів і пограти з Центром сповіщень у програмі Налаштування, щоб виправити це.

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


Для мене працював iOS 10 / iPhone 6S. Зауважте, що я зареєстрував, а потім видалив додаток перед перевстановленням.
Габріель Йенсен

5

Як сказав ianolito, встановлення дати повинно працювати:

Цього можна досягти, не фактично чекаючи дня, встановивши системний годинник вперед або на день, повністю вимкнути пристрій, а потім увімкнути пристрій.

Я помітив, що на моєму пристрої (iPhone 4, iOS 6.1.2) встановлення системного годинника на день вперед або навіть кілька днів не працювало для мене. Тому я встановив дату вперед на місяць, а потім вона спрацювала, і моя програма знову показала запит на сповіщення.

Сподіваюсь, це допомагає комусь, це може бути різновид болі в голові!


1
Не відповідайте на "Найновіша ОС" - вона постійно змінюється. Ця поведінка все ще порушена в 6.1.2, але, можливо, вона спрацювала в 6.0.1?
patr1ck

Відповідь відредаговано, це все ще є в 6.1.2 так і раніше в 6.0.1. Це працює для мене лише в тому випадку, якщо я принаймні встановив дату +1 місяць.
Вінсент Коен

1
Я також чув цілодобову річ, тому спробував це, і це не спрацювало 2 дні в просуванні. Встановіть його так, як 3 місяці, і спливаюче вікно з дозволом з’явилося знову! Дякую!
маркшилінг

Старий пост, але радий бачити, що він все ще допомагає! Удачі :)
Vincent Cohen

5

Я погоджуюся з micmdk .. У мене було налаштовано середовище розробки за допомогою Push Notifications, і мені потрібен був спосіб скинути телефон, щоб він виглядав як початкова установка… і лише ці точні кроки працювали для мене… вимагає ДВА перезавантаження пристрою:

Від APPLE TECH DOC:

Скидання сповіщень Push Notifications Повідомлення про дозвіл на iOS Перший раз, коли програма з включеним натисканням реєструється для push-сповіщень, iOS запитує користувача, чи бажає він отримувати сповіщення для цього додатка. Після того, як користувач відповів на це сповіщення, він більше не буде представлений, якщо пристрій не буде відновлено або додаток не видалено щонайменше протягом доби.

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

  1. Видаліть додаток із пристрою.

  2. Вимкніть пристрій повністю та увімкніть його знову.

  3. Перейдіть у Налаштування> Загальне> Дата та час та встановіть дату на день або більше.

  4. Знову повністю вимкніть прилад та увімкніть його знову.


Про це було сказано, що він більше не працює в іншій відповіді.
Beau Nouvelle

Це працює просто чудово. Що перестало працювати в iOS 5.1, це стара версія тієї іншої відповіді, яка виключала перезавантаження між видаленням програми та встановленням годинника вперед.
dgatwood

3

Я раніше про це замислювався і прийшов до висновку, що насправді це не дійсний тестовий випадок для мого коду. Я не думаю, що ваш додаток може насправді визначити різницю між тим, хто вперше відхиляє сповіщення або пізніше відключає його від налаштувань сповіщень iPhone. Це правда, що користувацький досвід відрізняється, але це приховано всередині виклику, щоб зареєструватиForRemoteNotificationTypes.

Виклик undegisterForRemoteNotifications не повністю видаляє програму з налаштувань сповіщень - хоча вона видаляє вміст налаштувань для цієї програми. Тому це все ще не призведе до того, що діалогове вікно буде вдруге представлено користувачеві наступного разу, коли програма запускається (принаймні, не на v3.1.3, з яким я зараз тестую). Але, як я говорю вище, ви, мабуть, не повинні турбуватися про це.


Я сподівався на кращу відповідь, але, мабуть, просто немає. Все одно, дякую!
hanno

3

Та сама технологічна записка, на яку згадується у прийнятій відповіді ( TN2265 - Усунення несправностей Push Notifications) , з тих пір оновлюється рішенням для iOS 5 і вище.

Коротше кажучи: створити резервну копію та відновити з неї кожен раз.

На iOS 5 та пізніших версіях скиньте сповіщення про дозвіл на натискання сповіщень, відновивши пристрій із резервної копії (r. 11450187). Ось такі кроки, щоб зробити це ефективно:

  1. Використовуйте Організатор Xcode, щоб встановити додаток на пристрій. Ключ - вперше встановити додаток, не запускаючи його.
  2. Використовуйте iTunes для створення резервної копії пристрою.
  3. Запустіть додаток. Буде представлено попередження про дозвіл на натискання сповіщень.
  4. Коли ви хочете скинути попередження про дозвіл на натискання сповіщень, відновіть пристрій із резервної копії, створеної на першому кроці.

Можливо, рекомендував би це свого часу, але це вже не робиться. Поточна рекомендація полягає в тому, щоб видалити додаток, перезавантажити, встановити годинник вперед, перезавантажити, необов’язково встановити годинник назад на правильну дату та час та запустити додаток.
dgatwood

2

У Apple Tech Note також описано, що ви можете відновити пристрій для скидання діалогового вікна Push Notification.

Це не говорить про те, що ви також можете скористатися опцією "Загальне -> Скинути -> Стерти весь вміст і налаштування" на самому пристрої (iOS 5.x).


1
Для чого це варто: я просто спробував "стерти всі налаштування", і це не вийшло. Спробуйте все налаштування вмісту та всіх налаштувань ...
Groxx

8
І "весь вміст та налаштування" справді працюють, дякую! Але святий ядерний варіант, Бетмен! Це абсолютно божевільно.
Грокс

94
Я чув, що покупка нового пристрою також знімає попередження про натискання!
samvermette

Я спробував придбати новий пристрій, але це теж не вийшло. Після вивезення нового пристрою на геніальну смугу вони попрацювали над магією та зафіксували більше грошей ... Я здивований, через стільки років Apple все ще не запропонувала практичного та простого способу скинути дозволи на натискання. Це смішно
Кріс

1

Крім відповіді ianolito.

З тією ж проблемою, що і з додатком, який я завантажив рік тому, і спочатку заборонив повідомлення про push. Тепер хочу повернути сповіщення, ці кроки працювали для мене на бета-версії iOS 7. Не впевнений, який пункт (и) викликав це саме.

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

Слава богу, мені не довелося "Стерти весь вміст і налаштування". Можливо, це комусь допоможе.


1

Нещодавно я зіткнувся з подібною проблемою із натисною програмою react. Версія iPhone OS 13.1. Я видалив додаток і спробував встановити додаток, і помітив, що дозволу на розташування та сповіщення не вимагається.

Перевіряючи налаштування, я міг бачити, що для моєї програми було ввімкнено місце розташування (з попередньої установки), проте не було відповідного запису проти сповіщення. Пробував видалення та перезавантаження без встановлення часу, він не працював. До речі, я також намагався завантажити додаток Appstore, як і раніше.

Проблему було вирішено лише після встановлення часу пристрою.


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
        }

    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.