Модальные 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)Позиционирование Modal Rich Media
Anchor link toModal Rich Media можно расположить в трех местах: вверху, внизу или по центру.
/** Enum, определяющий возможные позиции для отображения модального окна.
- `PWModalWindowPositionTop`: Модальное окно появляется в верхней части экрана, в пределах безопасной зоны. - `PWModalWindowPositionCenter`: Модальное окно появляется в центре экрана, в пределах безопасной зоны. - `PWModalWindowPositionBottom`: Модальное окно появляется в нижней части экрана, в пределах безопасной зоны. - `PWModalWindowPositionBottomSheet`: Модальное окно появляется в самом низу экрана, игнорируя безопасную зону. - `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 в нижней части экрана с анимацией появления слева направо и анимацией закрытия вправо:
Дополнительные параметры для Modal 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) }}