Photo Editing Extension:是什么、iOS扩展的功能

作者: IT Sectr 发布日期: 2026-06-15 阅读时间: 9 分钟

Photo Editing Extension — 是一种iOS机制,允许第三方应用直接在系统照片应用中添加编辑工具。与完整的编辑器不同,扩展不会将图像加载到单独的应用中——用户可以在不离开标准界面的情况下应用滤镜、校正颜色或添加效果。根据Apple Developer Documentation(2025),PhotoKit提供了超过40个API用于处理照片资源,包括PHAdjustmentData和PHContentEditingController。

要点

  • Photo Editing Extension 无需在程序间切换即可将编辑工具嵌入iOS的标准照片应用中
  • 架构基于PHContentEditingController协议构建,该协议管理界面显示和原始图像的获取
  • 扩展使用非破坏性编辑——所有更改都保存为AdjustmentData,原始文件保持不变
  • 为了处理图像,扩展接收包含完整图像文件和元数据的PHContentEditingInput
  • PhotoKit通过PHAsset、PHAssetResource和PHImageManager提供对照片资源的访问

什么是iOS中的Photo Editing Extension

Photo Editing Extension — 是iOS中的一种应用扩展类型,它将图像处理工具引入照片应用的标准界面。用户打开一张照片,点击「编辑」按钮,然后从已安装的扩展列表中选择所需的扩展。编辑完成后,结果保存回图库,原始文件仍可用于恢复。

这种架构解决了用户体验的关键问题:无需在应用之间切换、导出和导入图像或跟踪版本。根据WWDC 2025,所有扩展都在隔离的进程中运行,拥有自己的沙盒和有限的执行时间——每次编辑操作最多30秒

扩展无法访问设备内存中的任意文件——只能访问用户通过选择界面明确传递的照片。这确保了使用第三方工具时用户数据的安全性。

PhotoKit:架构和关键组件

PhotoKit — 是Apple用于处理设备媒体库的框架,出现在iOS 8中。它提供对照片资源的编程访问,包括照片、视频、相册和元数据。对于编辑扩展,PhotoKit充当存储和修改界面之间的中间层。

PHAsset和PHAssetResource

PHAsset代表图库中的单个媒体对象——照片或视频。通过PHAsset可以获取元数据:拍摄日期、文件类型、地图位置和相机方向。PHAssetResource提供对基本资源的访问——例如RAW或HEIC格式的原始照片文件。

对于编辑扩展,PHContentEditingInput至关重要——一个包含完整图像(或视频)文件的对象,可供读取和处理。扩展在激活时接收此对象并用作源材料。

PHImageManager和缓存

PHImageManager管理图像的加载和缓存。对于编辑扩展不直接使用——扩展通过PHContentEditingInput接收完整文件。但PHImageRequestOptions允许配置请求参数:大小、传递类型(同步或异步)和结果格式。

根据Apple的说法,PHImageManager会自动将图像缩略图缓存在RAM中,从而加速预览的重新显示。对于编辑扩展,建议使用PHImageRequestOptionsDeliveryModeHighQualityFormat以获得最佳图像质量。

swift
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true

PHImageManager.default().requestImage(
    for: asset,
    targetSize: .init(width: 1024, height: 1024),
    contentMode: .aspectFill,
    options: options
) { image, _ in
    // 使用图像进行显示
}

创建扩展:PHContentEditingController

每个Photo Editing Extension都实现PHContentEditingController协议——扩展的核心控制元素。该协议定义了显示界面、获取输入数据和保存结果的方法。

协议的主要方法

beginContentEditing(with:)在编辑会话启动时被调用。扩展接收PHContentEditingInput并应显示带有原始图像的界面。finishContentEditing(completionHandler:)完成编辑——扩展返回包含修改后文件和AdjustmentData的PHContentEditingOutput。cancelContentEditing()取消更改而不保存。

一个重要细节:在调用beginContentEditing时,扩展只能访问一个版本的照片——用户请求的那个版本。无法访问其他照片或相册。这是Apple为了安全而引入的沙盒限制。

swift
class PhotoEditingViewController: UIViewController {

    override func beginContentEditing(
        with input: PHContentEditingInput
    ) {
        guard let url = input.fullSizeImageURL else { return }
        let image = CIImage(contentsOf: url)
        displayImage.image = UIImage(ciImage: image)
    }
}

分离架构

PHContentEditingController将编辑界面与保存逻辑分离。主iOS进程调用beginContentEditing,扩展显示其UI,用户进行更改,然后finishContentEditing生成新文件。Apple建议所有资源密集型处理——CIFilter滤镜、Core Image操作——在后台线程中执行,而不是在主线程中,以免阻塞界面。

通过AdjustmentData进行非破坏性编辑

PHAdjustmentData — 在Photo Editing Extension中实现非破坏性编辑的关键机制。这是一个包含任意格式的应用更改信息的对象。扩展将滤镜参数、遮罩和设置序列化到AdjustmentData中,并与修改后的图像一起保存。

当重新打开照片时,扩展读取AdjustmentData,恢复之前的界面状态,并允许用户从同一位置继续编辑。如果扩展未安装——照片以最后保存的版本显示,原始文件单独存储。

根据Apple Documentation,PHAdjustmentData存储formatIdentifier和formatVersion——用于标识数据格式的字符串。在更新扩展时,应检查版本并正确处理旧格式。

swift
let adjustmentData = PHAdjustmentData(
    formatIdentifier: "com.example.photoediting",
    formatVersion: "1.0",
    data: NSKeyedArchiver.archivedData(
        withRootObject: params,
        requiringSecureCoding: true
    )
)
output.adjustmentData = adjustmentData

在finishContentEditing时,扩展将AdjustmentData写入PHContentEditingOutput对象,同时写入修改后的图像文件。然后系统保存两个组件:用于显示的版本和用于恢复编辑会话的元数据。

与照片应用的集成

Photo Editing Extension在安装包含它的应用后会自动出现在照片应用的菜单中。用户打开照片,选择「编辑」,在底部的工具行中会显示所有已安装的编辑扩展——包括系统扩展和第三方扩展。

扩展注册

扩展通过主应用的Info.plist使用NSExtensionActivationRule键进行注册,该键指定哪些内容类型会激活扩展。对于照片编辑器,ActivationRule通常要求image——扩展不会为视频或实况照片显示。

Apple建议指定具体的激活类型,以免使编辑菜单过载。如果扩展仅支持JPEG和HEIC,最好将激活限制在这些格式。

xml
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.photo-editing</string>
    <key>NSExtensionActivationRule</key>
    <string>SUBQUERY (extensionItems,
        @count <= 1)</string>
</dict>

与用户的交互

选择扩展后,iOS创建一个单独的进程,使用自定义的UIViewController显示在照片界面之上。用户看到自己的照片、扩展工具以及「取消」/「完成」按钮。扩展无法更改其控制器之外的导航,也无法访问系统的其他部分。

根据Apple的Human Interface Guidelines,扩展的界面应简洁实用——不含广告、外部链接和多余的导航元素。建议使用UIScrollView显示工具面板,以免屏幕过于拥挤。

常见问题

Photo Editing Extension如何获取对照片的访问权限?

扩展通过beginContentEditing(with:)方法接收包含完整图像文件URL的PHContentEditingInput。仅向一张选定的照片提供访问权限——无权限访问图库的其他资源。

扩展能否修改照片的原始文件?

不能,原始文件永远不会被修改。扩展通过PHContentEditingOutput创建新版本,AdjustmentData存储更改参数以便恢复到原始状态。

Photo Editing Extension支持哪些文件类型?

扩展支持PhotoKit支持的所有格式:JPEG、HEIC、RAW、PNG、TIFF和Live Photos。限制通过扩展Info.plist中的NSExtensionActivationRule设置。

编辑有多少时间?

iOS分配最多30秒用于执行finishContentEditing操作。超出限制时,扩展被强制终止,更改不会保存。使用CIFilter进行后台处理不会延长此时间。

可以在扩展中使用Core Image和Metal吗?

是的,Core Image(CIFilter)和Metal(用于自定义着色器)完全支持。Apple建议通过Grand Central Dispatch将繁重计算转移到后台线程。

总结

  • Photo Editing Extension — 是照片应用中嵌入的编辑工具,无需在应用间切换即可工作
  • 架构使用PHContentEditingController管理编辑会话和获取输入数据
  • PhotoKit提供PHAsset、PHImageManager和PHContentEditingInput用于访问设备媒体资源
  • PHAdjustmentData确保非破坏性编辑——序列化更改参数并支持恢复
  • 扩展在沙盒中运行,限制为30秒每次会话仅访问一张照片
  • 支持Core Image、Metal和所有PhotoKit格式:JPEG、HEIC、RAW、PNG、TIFF和Live Photos

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

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

讨论项目

另请阅读