Photo Editing Extension — 是一种iOS机制,允许第三方应用直接在系统照片应用中添加编辑工具。与完整的编辑器不同,扩展不会将图像加载到单独的应用中——用户可以在不离开标准界面的情况下应用滤镜、校正颜色或添加效果。根据Apple Developer Documentation(2025),PhotoKit提供了超过40个API用于处理照片资源,包括PHAdjustmentData和PHContentEditingController。
要点
Photo Editing Extension — 是iOS中的一种应用扩展类型,它将图像处理工具引入照片应用的标准界面。用户打开一张照片,点击「编辑」按钮,然后从已安装的扩展列表中选择所需的扩展。编辑完成后,结果保存回图库,原始文件仍可用于恢复。
这种架构解决了用户体验的关键问题:无需在应用之间切换、导出和导入图像或跟踪版本。根据WWDC 2025,所有扩展都在隔离的进程中运行,拥有自己的沙盒和有限的执行时间——每次编辑操作最多30秒。
扩展无法访问设备内存中的任意文件——只能访问用户通过选择界面明确传递的照片。这确保了使用第三方工具时用户数据的安全性。
PhotoKit — 是Apple用于处理设备媒体库的框架,出现在iOS 8中。它提供对照片资源的编程访问,包括照片、视频、相册和元数据。对于编辑扩展,PhotoKit充当存储和修改界面之间的中间层。
PHAsset代表图库中的单个媒体对象——照片或视频。通过PHAsset可以获取元数据:拍摄日期、文件类型、地图位置和相机方向。PHAssetResource提供对基本资源的访问——例如RAW或HEIC格式的原始照片文件。
对于编辑扩展,PHContentEditingInput至关重要——一个包含完整图像(或视频)文件的对象,可供读取和处理。扩展在激活时接收此对象并用作源材料。
PHImageManager管理图像的加载和缓存。对于编辑扩展不直接使用——扩展通过PHContentEditingInput接收完整文件。但PHImageRequestOptions允许配置请求参数:大小、传递类型(同步或异步)和结果格式。
根据Apple的说法,PHImageManager会自动将图像缩略图缓存在RAM中,从而加速预览的重新显示。对于编辑扩展,建议使用PHImageRequestOptionsDeliveryModeHighQualityFormat以获得最佳图像质量。
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
// 使用图像进行显示
}
每个Photo Editing Extension都实现PHContentEditingController协议——扩展的核心控制元素。该协议定义了显示界面、获取输入数据和保存结果的方法。
beginContentEditing(with:)在编辑会话启动时被调用。扩展接收PHContentEditingInput并应显示带有原始图像的界面。finishContentEditing(completionHandler:)完成编辑——扩展返回包含修改后文件和AdjustmentData的PHContentEditingOutput。cancelContentEditing()取消更改而不保存。
一个重要细节:在调用beginContentEditing时,扩展只能访问一个版本的照片——用户请求的那个版本。无法访问其他照片或相册。这是Apple为了安全而引入的沙盒限制。
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操作——在后台线程中执行,而不是在主线程中,以免阻塞界面。
PHAdjustmentData — 在Photo Editing Extension中实现非破坏性编辑的关键机制。这是一个包含任意格式的应用更改信息的对象。扩展将滤镜参数、遮罩和设置序列化到AdjustmentData中,并与修改后的图像一起保存。
当重新打开照片时,扩展读取AdjustmentData,恢复之前的界面状态,并允许用户从同一位置继续编辑。如果扩展未安装——照片以最后保存的版本显示,原始文件单独存储。
根据Apple Documentation,PHAdjustmentData存储formatIdentifier和formatVersion——用于标识数据格式的字符串。在更新扩展时,应检查版本并正确处理旧格式。
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,最好将激活限制在这些格式。
<!-- 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显示工具面板,以免屏幕过于拥挤。
常见问题
扩展通过beginContentEditing(with:)方法接收包含完整图像文件URL的PHContentEditingInput。仅向一张选定的照片提供访问权限——无权限访问图库的其他资源。
不能,原始文件永远不会被修改。扩展通过PHContentEditingOutput创建新版本,AdjustmentData存储更改参数以便恢复到原始状态。
扩展支持PhotoKit支持的所有格式:JPEG、HEIC、RAW、PNG、TIFF和Live Photos。限制通过扩展Info.plist中的NSExtensionActivationRule设置。
iOS分配最多30秒用于执行finishContentEditing操作。超出限制时,扩展被强制终止,更改不会保存。使用CIFilter进行后台处理不会延长此时间。
是的,Core Image(CIFilter)和Metal(用于自定义着色器)完全支持。Apple建议通过Grand Central Dispatch将繁重计算转移到后台线程。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。