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 notificationsfunc application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Pushwoosh.sharedInstance().handlePushReceived(userInfo) completionHandler(.noData)}- Para habilitar la visualización del Rich Media modal, establece el parámetro
Pushwoosh_RICH_MEDIA_STYLEen tu info.plist y asígnale el valorMODAL_RICH_MEDIA.
Info.plist:
<key>Pushwoosh_RICH_MEDIA_STYLE</key><string>MODAL_RICH_MEDIA</string>- 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.
- 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 ConfigurationPWModalWindowConfiguration.shared().configureModalWindow(with: .PWModalWindowPositionCenter, present: .PWAnimationPresentFromBottom, dismiss: .PWAnimationDismissUp)Posicionamiento del Rich Media modal
Anchor link toEl 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 toLos 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 TypePWModalWindowConfiguration.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 directionslet 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 radiusPWModalWindowConfiguration.shared().setCornerType([.PWCornerTypeTopLeft, .PWCornerTypeBottomRight], withRadius: 30.0)
// Close Modal Rich Media after N secondsPWModalWindowConfiguration.shared().closeModalWindow(after: 3)PWRichMediaPresentingDelegate
Anchor link toPara 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 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() // 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) }}