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

Модальные 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)
}
  1. Чтобы включить отображение модальных Rich Media, установите параметр Pushwoosh_RICH_MEDIA_STYLE в вашем info.plist и присвойте ему значение MODAL_RICH_MEDIA.

Info.plist:

<key>Pushwoosh_RICH_MEDIA_STYLE</key>
<string>MODAL_RICH_MEDIA</string>
  1. По умолчанию модальные Rich Media будут отображаться по центру экрана с анимацией появления снизу вверх.
  1. Чтобы настроить отображение модальных Rich Media (положение на экране, анимация появления, анимация закрытия), необходимо использовать следующий метод:
// Конфигурация модального Rich Media
PWModalWindowConfiguration.shared().configureModalWindow(with: .PWModalWindowPositionCenter,
present: .PWAnimationPresentFromBottom,
dismiss: .PWAnimationDismissUp)

Позиционирование Modal Rich Media

Anchor link to

Modal 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 Media
PWModalWindowConfiguration.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 UIKit
import 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)
}
}