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

Введение в push-уведомления для iOS

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

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

Вводный диалог, отображаемый перед системным запросом на разрешение
Вводный диалог, отображаемый перед системным запросом iOS на разрешение

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

Anchor link to

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

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

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

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

Anchor link to

Настройте вводный диалог с помощью текучего конструктора и вызовите 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

Передайте замыкание в 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