跳到内容

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
}

默认情况下,Modal Rich Media 将显示在屏幕中央,并带有从下到上的出现动画。

Anchor link to

Modal 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,并带有从左到右的显示动画和向右的关闭动画:

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.rawValue
Pushwoosh.media.modalRichMedia.setCornerType(CornerType(rawValue: topCorners), withRadius: 16)
// N 秒后关闭 Modal Rich Media
Pushwoosh.media.modalRichMedia.closeAfter(3)

触觉反馈类型:

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 UIKit
import PushwooshFramework
@main
class 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)
}
}