iOS 模态富媒体
从 Pushwoosh SDK 6.7.5 版本开始,您可以发送 Modal Rich Media (模态富媒体)。
我们引入了可自定义的全新 Modal Rich Media。新的 Modal Rich Media 不会完全遮挡屏幕,并且可以放置在屏幕的不同位置(顶部、底部和中央)。
有关富媒体页面的更多信息,请参阅我们的指南。
// 用于静默推送通知func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Pushwoosh.configure.handlePushReceived(userInfo) completionHandler(.noData)}选项 1:Info.plist 配置
Anchor link to要启用 Modal Rich Media 的显示,请在您的 info.plist 文件中设置参数 Pushwoosh_RICH_MEDIA_STYLE,并为其分配值 MODAL_RICH_MEDIA。
Info.plist:
<key>Pushwoosh_RICH_MEDIA_STYLE</key><string>MODAL_RICH_MEDIA</string>选项 2:通过代码配置 (SDK 7.0.14+)
Anchor link to您也可以在 AppDelegate 中通过代码配置富媒体的呈现样式:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 设置模态呈现样式 Pushwoosh.media.setRichMediaPresentationStyle(.modal)
// 配置模态窗口外观 Pushwoosh.media.modalRichMedia.configure( position: .PWModalWindowPositionBottom, presentAnimation: .PWAnimationPresentFromBottom, dismissAnimation: .PWAnimationDismissDown )
Pushwoosh.configure.registerForPushNotifications() return true}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 设置模态呈现样式 [[Pushwoosh media] setRichMediaPresentationStyle:PWRichMediaPresentationStyleModal];
// 配置模态窗口外观 [[[Pushwoosh media] modalRichMedia] configureWithPosition:PWModalWindowPositionBottom presentAnimation:PWAnimationPresentFromBottom dismissAnimation:PWAnimationDismissDown];
[[Pushwoosh configure] registerForPushNotifications]; return YES;}默认情况下,Modal Rich Media 将显示在屏幕中央,并带有从下到上的出现动画。
Modal Rich Media 定位
Anchor link toModal Rich Media 可以放置在屏幕的不同位置。
/** 定义模态窗口显示位置的枚举。
- `PWModalWindowPositionTop`: 模态窗口显示在屏幕顶部,安全区域内。 - `PWModalWindowPositionCenter`: 模态窗口显示在屏幕中央,安全区域内。 - `PWModalWindowPositionBottom`: 模态窗口显示在屏幕底部,安全区域内。 - `PWModalWindowPositionBottomSheet`: 模态窗口显示在屏幕最底部,忽略安全区域。 - `PWModalWindowPositionDefault`: 默认位置是屏幕中央,安全区域内。 */typedef NS_ENUM(NSInteger, ModalWindowPosition) { PWModalWindowPositionTop, // 显示在屏幕顶部(安全区域内) PWModalWindowPositionCenter, // 显示在屏幕中央(安全区域内) PWModalWindowPositionBottom, // 显示在屏幕底部(安全区域内) PWModalWindowPositionBottomSheet, // 显示在屏幕最底部(忽略安全区域) PWModalWindowPositionFullScreen, // 全屏,忽略安全区域内边距 PWModalWindowPositionDefault // 默认位置(屏幕中央,安全区域内)};下面的示例展示了显示在屏幕顶部的 Modal Rich Media。
Modal Rich Media 的显示动画包括:
typedef NS_ENUM(NSInteger, PresentModalWindowAnimation) { PWAnimationPresentFromBottom, PWAnimationPresentFromTop, PWAnimationPresentFromRight, PWAnimationPresentFromLeft, PWAnimationPresentNone};Modal Rich Media 的关闭动画包括:
typedef NS_ENUM(NSInteger, DismissModalWindowAnimation) { PWAnimationDismissDown, PWAnimationDismissUp, PWAnimationDismissLeft, PWAnimationDismissRight, PWAnimationCurveEaseInOut, PWAnimationDismissNone,
/** * 默认的关闭动画是 `PWAnimationCurveEaseInOut` */ PWAnimationDismissDefault};下面的示例演示了在屏幕底部显示 Modal Rich Media,并带有从左到右的显示动画和向右的关闭动画:
Modal Rich Media 的附加参数
Anchor link to用于显示 Modal Rich Media 的附加参数包括添加振动类型的触觉反馈、启用滑动手势以及设置在指定持续时间后自动关闭的计时器等选项。
// 触觉反馈类型Pushwoosh.media.modalRichMedia.setHapticFeedbackType(.PWHapticFeedbackLight)
// 滑动关闭方向Pushwoosh.media.modalRichMedia.setDismissSwipeDirections([ NSNumber(value: DismissSwipeDirection.PWSwipeDismissDown.rawValue), NSNumber(value: DismissSwipeDirection.PWSwipeDismissUp.rawValue)])
// 设置富媒体圆角半径let topCorners = PWCornerTypeTopLeft.rawValue | PWCornerTypeTopRight.rawValuePushwoosh.media.modalRichMedia.setCornerType(CornerType(rawValue: topCorners), withRadius: 16)
// N 秒后关闭 Modal Rich MediaPushwoosh.media.modalRichMedia.closeAfter(3)// 触觉反馈类型[[[Pushwoosh media] modalRichMedia] setHapticFeedbackType:PWHapticFeedbackLight];
// 滑动关闭方向[[[Pushwoosh media] modalRichMedia] setDismissSwipeDirections:@[ @(PWSwipeDismissDown), @(PWSwipeDismissUp)]];
// 设置富媒体圆角半径CornerType topCorners = PWCornerTypeTopLeft | PWCornerTypeTopRight;[[[Pushwoosh media] modalRichMedia] setCornerType:topCorners withRadius:16.0];
// N 秒后关闭 Modal Rich Media[[[Pushwoosh media] modalRichMedia] closeAfter:3.0];触觉反馈类型:
typedef NS_ENUM(NSInteger, HapticFeedbackType) { PWHapticFeedbackLight, // 轻微振动反馈 PWHapticFeedbackMedium, // 中等振动反馈 PWHapticFeedbackHard, // 强烈振动反馈 PWHapticFeedbackNone // 关闭振动(默认)};滑动方向:
typedef NS_ENUM(NSInteger, DismissSwipeDirection) { PWSwipeDismissDown, PWSwipeDismissUp, PWSwipeDismissLeft, PWSwipeDismissRight, PWSwipeDismissNone};PWRichMediaPresentingDelegate
Anchor link to要管理模态富媒体队列,您需要实现 PWRichMediaPresentingDelegate 的委托方法。
使用此功能时,模态富媒体会按顺序呈现,直到用户关闭当前的富媒体,下一个才会被显示。一旦用户关闭了已呈现的富媒体,属于另一个推送通知的下一个富媒体将会显示出来。
import UIKitimport PushwooshFramework
@mainclass AppDelegate: UIResponder, UIApplicationDelegate, PWRichMediaPresentingDelegate {
var richMediaQueue: [PWRichMedia] = [] var isPresenting = false
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 配置模态富媒体 Pushwoosh.media.setRichMediaPresentationStyle(.modal) Pushwoosh.media.modalRichMedia.configure( position: .PWModalWindowPositionBottom, presentAnimation: .PWAnimationPresentFromBottom, dismissAnimation: .PWAnimationDismissDown )
// 设置委托 Pushwoosh.media.modalRichMedia.delegate = self
Pushwoosh.configure.registerForPushNotifications() return true }
// MARK: - PWRichMediaPresentingDelegate
func richMediaManager(_ richMediaManager: PWRichMediaManager, shouldPresent richMedia: PWRichMedia) -> Bool { if !richMediaQueue.contains(where: { $0 === richMedia }) { richMediaQueue.append(richMedia) } return !isPresenting }
func richMediaManager(_ richMediaManager: PWRichMediaManager, didPresent richMedia: PWRichMedia) { isPresenting = true }
func richMediaManager(_ richMediaManager: PWRichMediaManager, didClose richMedia: PWRichMedia) { isPresenting = false
if let idx = richMediaQueue.firstIndex(where: { $0 === richMedia }) { richMediaQueue.remove(at: idx) }
// 呈现队列中的下一个富媒体 if let nextRichMedia = richMediaQueue.first { Pushwoosh.media.modalRichMedia.present(nextRichMedia) } }
func richMediaManager(_ richMediaManager: PWRichMediaManager, presentingDidFailFor richMedia: PWRichMedia, withError error: Error) { richMediaManager(richMediaManager, didClose: richMedia) }}#import "AppDelegate.h"#import <PushwooshFramework/PushwooshFramework.h>
@interface AppDelegate () <PWRichMediaPresentingDelegate>
@property (nonatomic, strong) NSMutableArray<PWRichMedia *> *richMediaQueue;@property (nonatomic, assign) BOOL isPresenting;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.richMediaQueue = [NSMutableArray array]; self.isPresenting = NO;
// 配置模态富媒体 [[Pushwoosh media] setRichMediaPresentationStyle:PWRichMediaPresentationStyleModal]; [[[Pushwoosh media] modalRichMedia] configureWithPosition:PWModalWindowPositionBottom presentAnimation:PWAnimationPresentFromBottom dismissAnimation:PWAnimationDismissDown];
// 设置委托 [[[Pushwoosh media] modalRichMedia] setDelegate:self];
[[Pushwoosh configure] registerForPushNotifications]; return YES;}
#pragma mark - PWRichMediaPresentingDelegate
- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia { if (![self.richMediaQueue containsObject:richMedia]) { [self.richMediaQueue addObject:richMedia]; } return !self.isPresenting;}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia { self.isPresenting = YES;}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia { self.isPresenting = NO;
[self.richMediaQueue removeObject:richMedia];
// 呈现队列中的下一个富媒体 if (self.richMediaQueue.count > 0) { [[[Pushwoosh media] modalRichMedia] presentRichMedia:self.richMediaQueue.firstObject]; }}
- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error { [self richMediaManager:richMediaManager didCloseRichMedia:richMedia];}
@end