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

Модальные 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 будут отображаться по центру экрана с анимацией появления снизу вверх.
Example
  1. Чтобы настроить отображение модальных Rich Media (положение на экране, анимацию появления и закрытия), необходимо использовать следующий метод:
// Конфигурация модального Rich Media
PWModalWindowConfiguration.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, отображаемое в верхней части экрана.

Example

Анимации появления модальных 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 в нижней части экрана с анимацией появления слева направо и анимацией закрытия вправо:

Example

Дополнительные параметры для модальных 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)
}
}