Notification Content Extension — 是什么,如何为 iOS 创建自定义界面

作者: IT Sectr 发布日期: 2026-03-21 阅读时间: 8 分钟

Notification Content Extension — 是一个 iOS 扩展,允许您将推送通知的标准界面替换为自定义 UIView。开发人员可以完全控制内容的显示:图像、视频、动画、自定义字体和交互元素。根据 Apple Developer, 2025Notification Content Extension 在通知的有限空间中支持任何 UIKit 界面。

要点

  • Notification Content Extension — 用于推送通知自定义 UI 的 iOS 扩展。
  • 该扩展实现了 UNNotificationContentExtension 协议,带有必需的 didReceive 方法。
  • 自定义界面在 Storyboard 中创建,可以包含任何 UIKit 组件
  • 扩展的最大大小 — 50 MB,压缩后不应超过 12 MB。
  • 该扩展为具有指定 categoryIdentifier 的通知激活。

什么是 Notification Content Extension

Notification Content Extension — 是 iOS 中的一个应用扩展,它用自定义 UIView 覆盖了推送通知的标准显示模板。与内容仅限于标题、副标题和正文的普通通知不同,该扩展允许显示任何 UIKit 界面:带坐标的地图、图表、图像库或输入表单。

它是如何工作的

当 iOS 收到带有指定 categoryIdentifier 的推送通知时,系统会检查该扩展是否已注册到该类别。如果是 — 系统会在一个单独的进程中启动扩展,并将通知内容传递给它。该扩展显示自己的界面而不是标准界面。用户无需打开主应用程序即可与自定义界面进行交互。

与 Notification Service Extension 的区别

重要的是不要将 Notification Content Extension 与 Notification Service Extension 混淆。Service Extension 在通知显示之前处理内容(下载附件、解密)。Content Extension 在接收到准备好的内容后替换界面。两个扩展可以协同工作:Service Extension 准备数据,Content Extension 显示数据。

特性Content ExtensionService Extension
目的自定义通知 UI在显示前修改内容
执行时间用户看到通知期间后台最多 30 秒
界面完整的 UIKit UIView无界面
APIUNNotificationContentExtensionUNNotificationServiceExtension

扩展的限制

Notification Content Extension 在资源有限的隔离进程中运行。除了 App Group 之外,该扩展无法通过 NSUserDefaults 访问主应用程序存储。扩展的大小限制为解压后的 50 MB。内容显示的时间也有限制 — 如果扩展未在合理时间内完成更新,系统将关闭它。

在 Xcode 中创建 Notification Content Extension

要在 Xcode 中创建扩展,需要添加一个类型为 Notification Content Extension 的新 target。Xcode 会自动创建 MainInterface.storyboard,其中包含一个继承自 UIViewController 并实现 UNNotificationContentExtension 的控制器。

添加 target 扩展

在 Xcode 中选择 File → New → Target → Notification Content Extension。指定扩展名称、语言(Swift 或 Objective-C),并确保项目连接到同一开发团队。创建 target 后,会出现一个包含三个文件的文件夹:MainInterface.storyboard、Info.plist 和控制器文件。

配置 Info.plist

在扩展的 Info.plist 中,必须指定带有 UNNotificationExtensionCategory 键的 NSExtensionAttributes 数组。此数组包含扩展将激活的通知类别的标识符。可选的 UNNotificationExtensionInitialContentSizeRatio 键为正确定位设置自定义界面的初始宽高比。

扩展的文件夹架构

建议在 target 扩展中保持清晰的架构:为控制器单独建一个文件夹,为自定义视图单独建一个。由于扩展是一个单独的二进制文件,主应用程序代码无法直接访问。要共享代码,请创建一个单独的 framework 或使用 App Group 来共享数据。

实现 UNNotificationContentExtension 协议

UNNotificationContentExtension — 是 Notification Content Extension 中的控制器必须实现的协议。唯一必需的方法是 didReceive(_:with:),在收到通知时调用。控制器接收通知和需要用数据更新的就绪视图控制器。

控制器的基本实现

扩展的控制器必须继承自 UIViewController 并实现 UNNotificationContentExtension。Storyboard 或 xib 与此控制器关联。收到通知后,didReceive 方法传递内容,控制器更新其视图。

swift
import UIKit
import UserNotifications
import UserNotificationsUI

class CustomNotificationViewController: UIViewController {

    @IBOutlet var titleLabel: UILabel!
    @IBOutlet var customImageView: UIImageView!

    func didReceive(
        notification: UNNotification
    ) {
        let content = notification.request.content
        titleLabel.text = content.title
        loadAttachment(content.attachments.first)
    }

    private func loadAttachment(attachment: UNNotificationAttachment?) {
        guard let url = attachment?.URL else { return }
        if let image = UIImage(contentsOfFile: url.path) {
            customImageView.image = image
        }
    }
}

extension CustomNotificationViewController: UNNotificationContentExtension {
    func didReceive(
        notification: UNNotification
    ) {
        didReceive(notification: notification)
    }
}

管理界面大小

系统根据 Info.plist 中的 UNNotificationExtensionInitialContentSizeRatio 键和当前内容确定自定义界面的大小。建议将此键设置为 0.1 以获得最小初始大小,然后在内容加载后通过 preferredContentSize 更改大小。

自定义界面和交互性

Notification Content Extension 在创建界面方面提供了完全的自由。可以使用任何 UIKit 组件:UITableView、MKMapView、WKWebView、UIStackView。但是,必须考虑通知的有限空间并优化性能。

向通知添加地图

常见的场景之一是显示带有位置的地图。为此,在扩展的 Storyboard 中添加 MKMapView,控制器从通知内容中传递坐标。重要的是不要忘记将 MapKit 添加到扩展的 target。使用地图时,请考虑扩展的内存限制 — 加载复杂的图块可能会超出可用资源。

动画和过渡

Notification Content Extension 支持 UIView 动画,包括更改大小、移动和元素透明度。进入通知的扩展模式时,可以启动内容出现的动画。动画应该简短(最多 0.5 秒),并且不妨碍用户与通知交互。避免无限动画 — 它们会消耗电池并降低性能。

处理自定义界面中的触摸

由于扩展是一个完整的 UIViewController,您可以添加手势和触摸处理。UIKit 手势(UITapGestureRecognizer、UIButton)正常工作。对于需要打开应用程序的操作,请使用扩展的委托或 userNotificationCenter。交互元素应该足够大,以便在有限的空间内舒适地触摸 — 根据 Apple 的建议,最小触摸目标大小为 44x44 点。

处理媒体和附件

多媒体内容 — 是 Notification Content Extension 的关键功能。通知可以包含在自定义界面中显示的图像、GIF、音频和视频。附件通过 UNNotificationAttachment 传递,它既可以通过服务器通过 payload 添加,也可以在下载后由 Notification Service Extension 添加。支持的格式为 JPEG、PNG、MPEG-4 和 MP3。

在扩展中显示媒体

要显示图像,只需从通知内容中获取 UNNotificationAttachment 并从本地 URL 加载。重要的是要记住,扩展只能访问本地文件 — 远程资源必须事先由 Service Extension 下载。最大大小附件 — iOS 15+ 上为 50 MB,该限制随每次后续更新而增加。要支持多张图像,请使用具有不同标识符的 UNNotificationAttachment,并通过 UIPageViewController 显示它们。

加载和显示图像

要在自定义界面中显示图像,扩展从通知内容中获取 UNNotificationAttachment 并从本地 URL 加载。附件必须事先由 Notification Service Extension 下载 — Content Extension 无权访问网络。媒体附件的最大大小 — iOS 15+ 上为 50 MB,在早期版本中限制为 10 MB。扩展应正确处理缺少附件的情况并显示后备界面。对于低分辨率图像的预加载,请使用 Service Extension 在附加之前创建的缩略图版本。

在通知中播放视频

iOS 支持通过 AVPlayerLayer 在 Notification Content Extension 中播放视频。扩展可以直接在通知中显示带有控制按钮的视频播放器。这对于视频监控、流媒体或内容预览应用程序特别有用。自动播放无声音是允许的,前提是用户在此通知中期望多媒体内容。在实现视频播放器时,添加控制元素:播放/暂停、进度条和关闭按钮。确保视频不会自动开始播放声音 — 这违反了 Apple 的用户体验建议。对于包含多张图像的幻灯片,使用 UIView.transition 通过翻页过渡选项在它们之间进行动画过渡。

优化扩展性能

Notification Content Extension 在内存限制约为 50 MB 的受限环境中运行。为了优化性能,请使用图像的延迟加载,避免在主线程上进行繁重计算,并应用带有简单约束的 Auto Layout。繁重的操作,例如图像处理或数据解析,在后台队列中执行(DispatchQueue.global)。如果超过内存限制,系统将关闭扩展,用户将看到标准通知。建议在发布前通过 Instruments(Allocations 和 Time Profiler)对扩展进行性能分析,并在具有不同 iOS 版本的真实设备上检查内存使用情况。

常见问题解答

可以在 Notification Content Extension 中使用 SwiftUI 吗?

可以,从 iOS 16 开始,Notification Content Extension 通过 UIHostingController 支持 SwiftUI。但是,由于扩展中对 SwiftUI 的支持有限,UIKit 仍然是复杂界面的更稳定选择。

为什么扩展没有为我的通知激活?

检查通知 payload 中的 categoryIdentifier 是否与扩展 Info.plist 中的 UNNotificationExtensionCategory 匹配。同时确保扩展已添加到主应用程序 target 并正确签名。

如何将数据从主应用程序传输到扩展?

使用 App Group — 共享存储(UserDefaults suite)或文件容器。主应用程序和扩展必须在同一开发组中,并且已启用 App Groups 功能。

如何在没有新通知的情况下更新扩展内容?

使用带有 UNNotificationContentExtensionMediaPlayPauseButtonType 的 didReceive(_:with:) 方法进行媒体控制,或通过委托请求更新。没有新通知的情况下无法完全更新内容。

如何调试 Notification Content Extension?

在 Xcode 中选择扩展 target,并在模拟器上运行。像在普通应用程序中一样使用 lldb 和断点。要测试,请通过 Firebase Console 或通过 Pusher 本地发送推送通知。

总结

  • Notification Content Extension — 用于推送通知自定义显示的 iOS 扩展。
  • 扩展实现了 UNNotificationContentExtension 并提供完整的 UIKit 界面。
  • 为具有匹配 categoryIdentifier 的通知激活。
  • 支持任何 UI 组件:地图、图像、视频、动画。
  • 在隔离进程中运行,通过 App Group 访问。
  • 大小限制 — 解压后的扩展为 50 MB
  • 对于媒体内容,使用由 Service Extension 准备的 UNNotificationAttachment。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读