Перейти к содержанию

Предварительный запрос на push-уведомления в iOS

Push primer — это диалог предварительного согласия, который вы показываете перед системным запросом на разрешение push-уведомлений в iOS. iOS показывает системный запрос только один раз за установку — если пользователь нажмет Не разрешать, возможность отправки push-уведомлений будет потеряна до тех пор, пока он не включит их снова в Настройках. Предварительный запрос позволяет сначала объяснить ценность уведомлений и запросить разрешение в подходящий момент, чтобы вы использовали единственный системный запрос для пользователей, которые уже дали согласие.

Доступно с версии 7.1.1. Предварительный запрос является частью PushwooshFramework; дополнительный модуль не требуется.

Диалоговое окно push primer, отображаемое перед системным запросом на разрешение
Push primer, отображаемый перед системным запросом на разрешение в iOS

Как это работает

Anchor link to

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

  • Не определено — показывает предварительный запрос; при согласии запускает системный запрос на разрешение.
  • Разрешено или предварительное разрешение — молча подавляет предварительный запрос (ничего не отображается).
  • Отклонено — показывает предварительный запрос; при согласии направляет пользователя в настройки уведомлений приложения (когда включен fallbackToSettings).

Вы решаете, когда вызывать предварительный запрос (например, после онбординга или после ключевого действия). SDK не навязывает собственное время вызова, за исключением опционального ограничения minInterval, описанного ниже.

Базовое использование

Anchor link to

Настройте предварительный запрос с помощью fluent builder и вызовите present. Минимальная настройка требует заголовок, сообщение и названия двух кнопок.

import PushwooshFramework
Pushwoosh.configure.pushPrimer
.title("Будьте в курсе")
.message("Получайте уведомления о скидках и обновлениях заказов первыми")
.acceptButton("Включить уведомления")
.declineButton("Не сейчас")
.present()

Стили и расположение

Anchor link to

Используйте style, чтобы выбрать между системным оповещением и кастомным листом, и position, чтобы разместить кастомный лист. Каждое положение имеет свой собственный дизайн по умолчанию.

ЗначениеОписание
.alertСистемный UIAlertController. Положение игнорируется.
.sheet + .bottomНижний лист, который выдвигается вверх, с захватом и кнопками во всю ширину (по умолчанию).
.sheet + .topКомпактный баннер, который появляется сверху, как уведомление.
.sheet + .centerЦентрированный диалог, который появляется с масштабированием и затуханием.
Pushwoosh.configure.pushPrimer
.style(.sheet)
.position(.top)
.title("Будьте в курсе")
.message("Получайте уведомления о скидках и обновлениях заказов первыми")
.acceptButton("Включить уведомления")
.declineButton("Не сейчас")
.present()
Push primer в нижнем, верхнем и центральном положениях

Кастомизация

Anchor link to

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

Pushwoosh.configure.pushPrimer
.style(.sheet)
.position(.center)
.title("Будьте в курсе")
.message("Получайте уведомления о скидках и обновлениях заказов первыми")
.acceptButton("Включить уведомления")
.declineButton("Не сейчас")
.image(UIImage(named: "PrimerHero")) // локальное изображение, или .imageURL("https://…")
.backgroundColor(.systemBackground)
.titleColor(.label)
.messageColor(.secondaryLabel)
.acceptButtonColor(.systemBlue)
.acceptButtonTextColor(.white)
.declineButtonColor(.clear)
.declineButtonTextColor(.secondaryLabel)
.cornerRadius(24)
.buttonCornerRadius(14)
.buttonBorderColor(.separator)
.present()

Справочник по кастомизации:

СеттерОписание
image / imageURLЛокальный UIImage или удаленный URL. Отображается в виде круга в центральном и нижнем макетах, и как иконка в верхнем баннере. Локальное изображение имеет приоритет над URL.
backgroundColorСплошной цвет фона карточки.
backgroundGradientМассив цветов, отображаемый в виде мягкого многоцветного градиента. Переопределяет backgroundColor.
titleColor / messageColorЦвета текста заголовка и сообщения.
acceptButtonColor / acceptButtonTextColorЦвета фона и текста кнопки согласия. Цвет согласия также окрашивает иконку по умолчанию.
declineButtonColor / declineButtonTextColorЦвета фона и текста кнопки отказа.
cornerRadiusРадиус скругления углов карточки.
buttonCornerRadius / buttonBorderColorРадиус скругления углов и цвет рамки обеих кнопок.

Настройки поведения

Anchor link to

Переход в Настройки

Anchor link to

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

.fallbackToSettings(false)

Частота отображения

Anchor link to

По умолчанию у предварительного запроса нет встроенного ограничения — он показывается каждый раз, когда вы вызываете present (и автоматически подавляется после авторизации уведомлений). Используйте minInterval, чтобы ограничить частоту повторного появления предварительного запроса. Время последнего показа сохраняется между запусками.

.minInterval(7 * 24 * 60 * 60) // показывать не чаще одного раза в неделю

Обработка результата

Anchor link to

Передайте completion в present, чтобы отреагировать на результат.

Pushwoosh.configure.pushPrimer
.title("Будьте в курсе")
.message("Получайте уведомления о скидках и обновлениях заказов первыми")
.acceptButton("Включить уведомления")
.declineButton("Не сейчас")
.present { outcome in
switch outcome {
case .accepted: break // показан, пользователь согласился, запрошен системный запрос
case .declined: break // показан, пользователь отказался
case .suppressed: break // не показан (уже разрешено или ограничено по частоте)
case .redirectedToSettings: break // состояние отклонения, пользователь отправлен в Настройки
@unknown default: break
}
}

Окончательный результат системного запроса (состояние предоставления/отклонения и токен устройства) поступает через обычные колбэки регистрации — предварительный запрос повторно использует registerForPushNotifications при согласии и не дублирует эту цепочку.

Справочные материалы

Anchor link to