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

Как это работает
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()
Кастомизация
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 при согласии и не дублирует эту цепочку.