Rich Notification是iOS推送通知的扩展格式,包含多媒体附件、交互式按钮和自定义界面,以改善用户体验。与标准文本通知不同,Rich Notification可以在横幅或锁屏上直接显示图片、视频和音频。根据Apple Developer Documentation, 2026,UNNotificationAttachment支持在一条通知中最多包含10个文件,并自动缩放它们以在所有设备上优化显示。
要点
Rich Notification是一种iOS推送通知,不仅包含文本,还包含多媒体附件、交互式元素和自定义界面。术语“rich”(丰富)反映了在通知中包含图片、视频、音频、操作按钮和文本输入的能力,将简单的提醒转变为完整的交互式元素。
Apple在iOS 10中随UserNotifications框架引入了对Rich Notification的支持。在此之前,推送通知只能包含文本、声音和标记。iOS 10引入了UNNotificationServiceExtension和UNNotificationContentExtension,开启了修改内容和创建自定义界面的可能性。在后续版本中,添加了对Content Extension中SwiftUI的支持、动画GIF和改进的媒体缩放。
Rich Notification显著提高了用户参与度。Apple的研究表明,带图片的通知比纯文本通知获得30–40%更多的交互。产品图片、视频预览或快速回复按钮允许用户直接从通知中做出决定,而无需打开应用。这缩短了到达目标操作的路径,改善了用户体验。
UNNotificationAttachment支持三类媒体:图片、视频和音频。每种类型在格式、大小和时长方面都有自己的限制。系统自动将图片缩放到通知大小,并将视频时长限制为30秒以优化性能。
| 媒体类型 | 支持的格式 | 最大大小 |
|---|---|---|
| 图片 | JPEG、PNG、GIF、TIFF | 每个文件10 MB |
| 视频 | MPEG、MP4、MOV | 10 MB,最长30秒 |
| 音频 | MP3、AAC、WAV、CAF | 10 MB |
图片由系统自动裁剪和缩放,以便在通知的紧凑和扩展视图中显示。动画GIF从iOS 12开始支持,并在查看通知时自动播放。推荐图片大小为1024x1024像素,确保在所有设备上(包括大屏幕iPad)清晰显示。
Rich Notification中的视频默认静音播放—用户可以通过播放器中的按钮开启声音。最大视频时长为30秒,之后播放停止。音频附件可用于语音消息或声音预览,在扩展视图中点击通知时播放。
交互式操作允许用户直接从通知中执行操作,而无需打开应用。操作在应用启动时通过UNNotificationCategory和UNNotificationAction注册。每个操作可以是后台(不打开应用)或前台(打开应用以完成操作)。
UNNotificationAction是一个带有标题和可选修饰符的按钮,如requiresAuthentication(需要Face ID/Touch ID)或destructive(红色突出显示)。UNTextInputNotificationAction通过添加文本输入字段扩展了此功能—非常适合快速回复消息或评论。操作通过长按通知或向下滑动显示。
通知类别将内容类型与可用操作集关联起来。注册过程在应用启动时在AppDelegate中通过UNUserNotificationCenter.current().setNotificationCategories执行。类别在服务器上的JSON payload的category字段中指定,系统自动将相应的操作集应用于通知。
当用户点击按钮或发送文本时,系统调用委托UNUserNotificationCenterDelegate的didReceive response方法。UNNotificationResponse包含操作标识符和输入的文本(对于UNTextInputNotificationAction)。基于这些信息,应用执行相应的业务逻辑:发送消息、确认操作或打开特定屏幕。
让我们看看创建Rich Notification的完整周期:从在AppDelegate中注册类别到在Service Extension中处理和显示。AppDelegate注册带有按钮的类别,服务器发送带有图片URL的通知,Service Extension下载媒体,Content Extension显示带有按钮的自定义界面。
// AppDelegate — 注册分类和操作
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "回复",
options: [.authenticationRequired])
let likeAction = UNNotificationAction(
identifier: "like",
title: "喜欢",
options: [])
let category = UNNotificationCategory(
identifier: "social_post",
actions: [replyAction, likeAction],
intentIdentifiers: [],
options: [])
UNUserNotificationCenter.current()
.setNotificationCategories([category])
return true
}
接收到带有类别“social_post”和自定义字段中图片URL的推送通知后,Service Extension被激活。扩展通过网络下载图片,创建具有唯一标识符的UNNotificationAttachment并将其添加到内容中。检查下载文件的大小很重要—如果超过10 MB,附件将无法创建,系统将显示没有媒体的通知。
class NotificationService: UNNotificationServiceExtension {
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as! UNMutableNotificationContent)
guard let urlString = content.userInfo["media-url"]
as? String,
let url = URL(string: urlString)
else { contentHandler(request.content); return }
URLSession.shared.downloadTask(with: url) {
location, _, _ in
guard let location = location else {
contentHandler(content); return }
let attachment = try! UNNotificationAttachment(
identifier: "media", url: location,
options: [UNNotificationAttachmentOptionsTypeHintKey:
"jpg"])
content.attachments = [attachment]
contentHandler(content)
}.resume()
}
}
要在没有服务器的情况下测试Rich Notification,请使用iOS模拟器并通过终端使用xcrun simctl push发送推送。在payload中必须指定mutable-content: 1以激活Service Extension,以及category以显示操作。该命令从JSON文件直接向选定的模拟器发送推送,无需设置服务器基础设施即可快速迭代。
UNNotificationContentExtension允许用任意UIKit或SwiftUI视图完全替换标准通知界面。扩展在用户展开通知时激活(force touch或向下滑动),可以包含按钮、滑块、动画和其他UI组件。界面大小通过Auto Layout适应内容。
Content Extension基于storyboard,使用继承自UIViewController的视图。SwiftUI View从iOS 16开始通过UIHostingController集成,允许使用现代方法来构建界面。为了向后兼容iOS 14–15,建议使用带有xib文件的UIKit。界面通过UNNotificationContent从Service Extension接收修改后的内容。
Content Extension实现UNNotificationContentExtension协议,包含didReceive response方法。UNNotificationResponse包含有关按下的按钮或输入的文本的信息。扩展可以更新界面而不关闭通知,或调用completion handler来关闭它。这允许创建快速交互场景,例如在通知中直接带有视觉反馈的“点赞”。
Apple建议Content Extension简洁且功能性强,避免多余元素。展开通知的最大高度约为400点,之后内容滚动。使用系统字体和间距以与其他通知保持一致性。在不同屏幕尺寸上测试,以确保界面在iPhone和iPad上都能正确显示。
常见问题解答
一个多媒体附件的最大大小为10 MB。超出限制时,UNNotificationAttachment不会被创建,通知将无媒体显示。建议将图片优化到1–3 MB,以便在Service Extension中快速下载。
Rich Notification在所有运行iOS 10及以上的设备上支持,包括iPhone 5s及更新机型。带有自定义UI的Content Extension从iOS 12开始可用。Content Extension中的SwiftUI—从iOS 16开始。在较旧版本上,通知以标准形式显示。
可以,动画GIF从iOS 12开始支持。GIF通过UNNotificationAttachment作为普通图片下载,并在查看通知时自动播放。GIF的大小与其他格式一样限制在10 MB。
注册类别时每条通知最多4个操作。如果更多,系统显示前4个,忽略其余。建议使用2–3个按钮以获得最佳用户体验—选项太多会使界面过载。
是的,服务器需要通过APNS(Apple Push Notification service)发送推送,payload中包含自定义字段中的媒体文件URL和标志mutable-content: 1。服务器还指定category以激活Content Extension和操作。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。