Модальные Rich Media для iOS
Начиная с версии Pushwoosh SDK 6.7.5, у вас есть возможность отправлять модальные Rich Media.
Мы представляем новые модальные Rich Media, которые можно настраивать. Новые модальные Rich Media не блокируют экран полностью и могут располагаться в разных его частях (вверху, внизу и по центру).
Дополнительную информацию о страницах Rich Media можно найти в нашем руководстве.
Конфигурация
Anchor link to//для тихих push-уведомленийfunc application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Pushwoosh.sharedInstance().handlePushReceived(userInfo) completionHandler(.noData)}
- Чтобы включить отображение модальных Rich Media, установите параметр
Pushwoosh_RICH_MEDIA_STYLE
в вашем info.plist и присвойте ему значениеMODAL_RICH_MEDIA
.
Info.plist:
<key>Pushwoosh_RICH_MEDIA_STYLE</key><string>MODAL_RICH_MEDIA</string>
- По умолчанию модальные Rich Media будут отображаться по центру экрана с анимацией появления снизу вверх.

- Чтобы настроить отображение модальных Rich Media (положение на экране, анимацию появления и закрытия), необходимо использовать следующий метод:
// Конфигурация модального Rich MediaPWModalWindowConfiguration.shared().configureModalWindow(with: .PWModalWindowPositionCenter, present: .PWAnimationPresentFromBottom, dismiss: .PWAnimationDismissUp)
Позиционирование модальных Rich Media
Anchor link toМодальные Rich Media можно разместить в трех местах: вверху, внизу или по центру.
/** Enum, определяющий возможные позиции для отображения модального окна.
- `PWModalWindowPositionTop`: модальное окно появляется в верхней части экрана, в пределах безопасной зоны. - `PWModalWindowPositionCenter`: модальное окно появляется в центре экрана, в пределах безопасной зоны. - `PWModalWindowPositionBottom`: модальное окно появляется в нижней части экрана, в пределах безопасной зоны. - `PWModalWindowPositionBottomSheet`: модальное окно появляется в самом низу экрана, игнорируя безопасную зону. - `PWModalWindowPositionFullScreen`: полноэкранный режим, игнорирует отступы безопасной зоны. - `PWModalWindowPositionDefault`: позиция по умолчанию — центр экрана, в пределах безопасной зоны. */typedef NS_ENUM(NSInteger, ModalWindowPosition) { PWModalWindowPositionTop, // Появляется в верхней части экрана (в пределах безопасной зоны) PWModalWindowPositionCenter, // Появляется в центре экрана (в пределах безопасной зоны) PWModalWindowPositionBottom, // Появляется в нижней части экрана (в пределах безопасной зоны) PWModalWindowPositionBottomSheet, // Появляется в самом низу экрана (игнорирует безопасную зону) PWModalWindowPositionFullScreen, // Полноэкранный режим, игнорирует отступы безопасной зоны PWModalWindowPositionDefault // Позиция по умолчанию (центр экрана, в пределах безопасной зоны)};
В примере ниже показано модальное Rich Media, отображаемое в верхней части экрана.

Анимации появления модальных Rich Media включают:
typedef NS_ENUM(NSInteger, PresentModalWindowAnimation) { PWAnimationPresentFromBottom, PWAnimationPresentFromTop, PWAnimationPresentFromRight, PWAnimationPresentFromLeft, PWAnimationPresentNone};
Анимации закрытия модальных Rich Media включают:
typedef NS_ENUM(NSInteger, DismissModalWindowAnimation) { PWAnimationDismissDown, PWAnimationDismissUp, PWAnimationDismissLeft, PWAnimationDismissRight, PWAnimationCurveEaseInOut, PWAnimationDismissNone,
/** * Анимация закрытия по умолчанию — `PWAnimationCurveEaseInOut` */ PWAnimationDismissDefault};
Пример ниже демонстрирует отображение модального Rich Media в нижней части экрана с анимацией появления слева направо и анимацией закрытия вправо:

Дополнительные параметры для модальных Rich Media
Anchor link toДополнительные параметры для отображения модальных Rich Media включают такие опции, как добавление тактильного отклика (вибрации), включение жестов свайпа и установка таймера автоматического закрытия через указанный промежуток времени.
// Тип тактильного откликаPWModalWindowConfiguration.shared().setPresent(.PWHapticFeedbackLight)
/**enum HapticFeedbackType
typedef NS_ENUM(NSInteger, HapticFeedbackType) { PWHapticFeedbackLight, // Легкая вибрация PWHapticFeedbackMedium, // Средняя вибрация PWHapticFeedbackHard, // Сильная вибрация
/** * По умолчанию вибрация отключена. */ PWHapticFeedbackNone};*/
// Направления свайпаlet directions: [NSNumber] = [ NSNumber(value: DismissSwipeDirection.PWSwipeDismissDown.rawValue), NSNumber(value: DismissSwipeDirection.PWSwipeDismissUp.rawValue)]PWModalWindowConfiguration.shared().setDismissSwipeDirections(directions)
/**typedef NS_ENUM(NSInteger, DismissSwipeDirection) { PWSwipeDismissDown, PWSwipeDismissUp, PWSwipeDismissLeft, PWSwipeDismissRight, PWSwipeDismissNone};*/
// Установка радиуса скругления углов Rich MediaPWModalWindowConfiguration.shared().setCornerType([.PWCornerTypeTopLeft, .PWCornerTypeBottomRight], withRadius: 30.0)
// Закрыть модальное Rich Media через N секундPWModalWindowConfiguration.shared().closeModalWindow(after: 3)
PWRichMediaPresentingDelegate
Anchor link toЧтобы управлять очередью модальных Rich Media, необходимо реализовать методы делегата PWRichMediaPresentingDelegate. При использовании этой функции модальные Rich Media представляются последовательно, и следующее не будет отображено до тех пор, пока пользователь не закроет текущее. Как только пользователь закроет представленное Rich Media, будет показано следующее, которое было частью другого push-уведомления.
Для реализации этой функциональности используйте код, приведенный ниже:
import UIKitimport PushwooshFramework
class ViewController: UIViewController {
override func viewDidLoad() { super.viewDidLoad()
PWRichMediaManager.shared().delegate = ChainedRichMediaPresentingDelegate.init(queue: [], inApp: false) }}
class ChainedRichMediaPresentingDelegate: NSObject, PWRichMediaPresentingDelegate {
var queue: [PWRichMedia] var inAppIsPresenting: Bool
init(queue: [PWRichMedia], inApp: Bool) { self.queue = queue self.inAppIsPresenting = inApp super.init() // в этом примере можно опустить, так как это произойдет автоматически. }
convenience override init() { self.init(queue: [], inApp: false) }
func richMediaManager(_ richMediaManager: PWRichMediaManager!, shouldPresent richMedia: PWRichMedia!) -> Bool { if !queue.contains(where: { $0 === richMedia }) { queue.append(richMedia) } return !inAppIsPresenting }
func richMediaManager(_ richMediaManager: PWRichMediaManager!, didPresent richMedia: PWRichMedia!) { inAppIsPresenting = true }
func richMediaManager(_ richMediaManager: PWRichMediaManager!, didClose richMedia: PWRichMedia!) { inAppIsPresenting = false
if let idx = queue.firstIndex(where: { $0 === richMedia }) { queue.remove(at: idx) }
if ((queue.count) != 0) { PWModalWindowConfiguration.shared().presentModalWindow(queue.first!) } }
func richMediaManager(_ richMediaManager: PWRichMediaManager!, presentingDidFailFor richMedia: PWRichMedia!, withError error: Error!) { self.richMediaManager(richMediaManager, didClose: richMedia) }}