使用调整数据一次性创建 PHAsset

PHAsset Create with Adjustment Data in One Go

TL,DR:

我想在照片库中创建新资产并对其应用调整数据(编辑),而不提示用户两次

背景

我正在开发 iOS 照片编辑扩展程序 ,并在容器应用程序中提供类似的功能。

为了更好的代码重用和模块化,我在扩展(必需)和容器应用程序上采用基于 PHContentEditingController 的流程,将所有共享组件捆绑在一个嵌入式框架中,应用程序和扩展 link 针对 (as recommended by Apple).


应用扩展是 "passed" 由照片应用编辑并在其监督下执行的图像,容器应用需要请求对资源库进行更改,每次都会提示用户授权。

启动时,该应用程序会为用户提供两种选择来获取要编辑的图像:

(当然这两个选项都依赖UIImagePickerController

现在,从库中读取的图像与应用程序扩展中的图像进行相同的编辑流程,唯一的区别是我自己的 UI 代码手动调用 finishContentEditing(completionHandler:) ( shared) object,它采用 PHContentEditingController 协议,完成后,它进一步调用 PHAssetLibrary 方法 performChanges(_:completionHandler)(触发授权提示)。

这意味着在使用照片应用 中的扩展程序重新编辑同一图像时,可以 还原 容器应用中所做的编辑(并且可能反之-反之亦然,一旦我得到支持调整数据)。

对于用相机拍摄的新图像,但是,我采用了不同的方法。应用过滤器后,我只是使用旧功能将结果保存到照片库中:

UIImageWriteToSavedPhotosAlbum(_:_:_:_:)

(回到还没有参数标签的时代:-)


问题

此方法的问题在于,对于用相机拍摄并在应用程序中编辑的图像,编辑总是 'baked in'(无法还原)。这感觉很武断,甚至可能让用户感到困惑,所以我正在寻找 更统一的方法。

我可以在用户拍照后立即将照片保存到图库中,并从那里使用与现有资产相同的流程,但这意味着我需要修改图库 两次:

  1. 创建新资产
  2. 保存对新资产的编辑

...这将导致两次请求用户许可:一次是在编辑图像之前,另一次是在提交编辑时。

那么,我的问题是:

有没有办法创建库资源"In One Go"、原始图像调整数据?

虽然我还没有在我的代码上尝试过这个(我有 now), I seem to have found what seems to be the exact answer to my question in Apple's documentation for one of the initializers of the PHContentEditingOutput class:

init(placeholderForCreatedAsset: PHObjectPlaceholder)

来自文档:

Discussion

Use this method if you want to add a new asset to the Photos library with edited content, as opposed to editing the content of an asset after adding it to the library. For example, you might use this option if your app applies filters to photos it captures with the device camera—instead of saving only the filtered image to the Photos library, your app can save both the filtered and the original image, allowing the user to revert to the original image or apply different filters later.

另外:

Note

If your app edits the contents of assets already in the Photos library—including assets your app has itself recently added—Photos prompts the user for permission to change the asset’s content. If instead your app uses the init(placeholderForCreatedAsset:) method to create an asset with edited content, Photos recognizes your app’s ownership of the content and therefore does not need to prompt the user for permission to edit it.


我想我们都需要时不时来一次健康剂量的 RTFM! :-)