Saltar al contenido

Rich Media modal para iOS

A partir de la versión 6.7.5 del SDK de Pushwoosh, tienes la capacidad de enviar Rich Media modal.

Estamos introduciendo un nuevo Rich Media modal, que puede ser personalizado. El nuevo Rich Media modal no bloquea completamente la pantalla y puede posicionarse en diferentes partes de la pantalla (superior, inferior y centro).

Para más información sobre las páginas de Rich Media, por favor consulta nuestra guía.

Configuración

Anchor link to
//for silent push notifications
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
Pushwoosh.sharedInstance().handlePushReceived(userInfo)
completionHandler(.noData)
}
  1. Para habilitar la visualización del Rich Media modal, establece el parámetro Pushwoosh_RICH_MEDIA_STYLE en tu info.plist y asígnale el valor MODAL_RICH_MEDIA.

Info.plist:

<key>Pushwoosh_RICH_MEDIA_STYLE</key>
<string>MODAL_RICH_MEDIA</string>
  1. Por defecto, el Rich Media modal se mostrará en el centro de la pantalla con una animación de aparición de abajo hacia arriba.
  1. Para configurar la visualización del Rich Media modal (posición en la pantalla, animación de mostrar, animación de cerrar), necesitas usar el siguiente método:
// Modal Rich Media Configuration
PWModalWindowConfiguration.shared().configureModalWindow(with: .PWModalWindowPositionCenter,
present: .PWAnimationPresentFromBottom,
dismiss: .PWAnimationDismissUp)

Posicionamiento del Rich Media modal

Anchor link to

El Rich Media modal puede posicionarse en tres ubicaciones: superior, inferior o centro.

/**
Enum defining the possible positions for displaying a modal window.
- `PWModalWindowPositionTop`: The modal window appears at the top of the screen, within the safe area.
- `PWModalWindowPositionCenter`: The modal window appears at the center of the screen, within the safe area.
- `PWModalWindowPositionBottom`: The modal window appears at the bottom of the screen, within the safe area.
- `PWModalWindowPositionBottomSheet`: The modal window appears at the very bottom of the screen, ignoring the safe area.
- `PWModalWindowPositionDefault`: The default position is the center of the screen, within the safe area.
*/
typedef NS_ENUM(NSInteger, ModalWindowPosition) {
PWModalWindowPositionTop, // Appears at the top of the screen (within safe area)
PWModalWindowPositionCenter, // Appears at the center of the screen (within safe area)
PWModalWindowPositionBottom, // Appears at the bottom of the screen (within safe area)
PWModalWindowPositionBottomSheet, // Appears at the very bottom of the screen (ignores safe area)
PWModalWindowPositionFullScreen, // Fullscreen, ignores safe area insets
PWModalWindowPositionDefault // Default position (center of the screen, within safe area)
};

El ejemplo a continuación muestra un Rich Media modal desplegado en la parte superior de la pantalla.

Las animaciones para mostrar el Rich Media modal incluyen:

typedef NS_ENUM(NSInteger, PresentModalWindowAnimation) {
PWAnimationPresentFromBottom,
PWAnimationPresentFromTop,
PWAnimationPresentFromRight,
PWAnimationPresentFromLeft,
PWAnimationPresentNone
};

Las animaciones para cerrar el Rich Media modal incluyen:

typedef NS_ENUM(NSInteger, DismissModalWindowAnimation) {
PWAnimationDismissDown,
PWAnimationDismissUp,
PWAnimationDismissLeft,
PWAnimationDismissRight,
PWAnimationCurveEaseInOut,
PWAnimationDismissNone,
/**
* Default dismiss animation is `PWAnimationCurveEaseInOut`
*/
PWAnimationDismissDefault
};

El ejemplo a continuación demuestra la visualización de un Rich Media modal en la parte inferior de la pantalla con una animación de aparición de izquierda a derecha y una animación de cierre hacia la derecha:

Parámetros adicionales para el Rich Media modal

Anchor link to

Los parámetros adicionales para mostrar el Rich Media modal incluyen opciones como agregar retroalimentación háptica de tipo vibración, habilitar gestos de deslizamiento y establecer un temporizador de cierre automático después de una duración especificada.

// Haptic Feedback Type
PWModalWindowConfiguration.shared().setPresent(.PWHapticFeedbackLight)
/**
enum HapticFeedbackType
typedef NS_ENUM(NSInteger, HapticFeedbackType) {
PWHapticFeedbackLight, // Light vibration feedback
PWHapticFeedbackMedium, // Medium vibration feedback
PWHapticFeedbackHard, // Strong vibration feedback
/**
* Vibration is off by default.
*/
PWHapticFeedbackNone
};
*/
// Swipe directions
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
};
*/
// Set Rich Media corner radius
PWModalWindowConfiguration.shared().setCornerType([.PWCornerTypeTopLeft, .PWCornerTypeBottomRight], withRadius: 30.0)
// Close Modal Rich Media after N seconds
PWModalWindowConfiguration.shared().closeModalWindow(after: 3)

PWRichMediaPresentingDelegate

Anchor link to

Para gestionar la cola de rich media modales, necesitas implementar los métodos delegados de PWRichMediaPresentingDelegate. Al usar esta funcionalidad, los rich media modales se presentan secuencialmente, y el siguiente no se mostrará hasta que el usuario cierre el actual. Una vez que el usuario cierra el rich media presentado, se mostrará el siguiente, que era parte de otra notificación push.

Para implementar esta funcionalidad, utiliza el código proporcionado a continuación:

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() // can actually be omitted in this example because will happen automatically.
}
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)
}
}