iOS 8 照片库 - 使用 PHAssetChangeRequest 添加资产时出错

Posted

技术标签:

【中文标题】iOS 8 照片库 - 使用 PHAssetChangeRequest 添加资产时出错【英文标题】:iOS 8 Photo Library -- Error adding an asset using PHAssetChangeRequest 【发布时间】:2015-04-30 17:41:33 【问题描述】:

我在尝试使用 [PHAssetChangeRequest creationReqeustForAssetFromImageAtFileURL:] 创建照片资源时收到“不允许操作”错误。我正在尝试通过首先获取第一张照片的路径名来从照片库中复制另一张照片。

该功能在模拟器上运行时按预期工作,但在实际设备上运行时失败。模拟器和设备都运行 ios 8.3。 iPad 设置为在 iCloud 上存储照片,而模拟器则不是。

我的代码 sn-p

    [[phphotoLibrary sharedPhotoLibrary] performChanges:^
          PHAssetChangeRequest *assetChangeRequest = 
                   [PHAssetChangeReques creationRequestForAssetFromImageAtFileURL:currentImagePath];
     completionHandler:^(BOOL success, NSError *error) 
       if (!success) 
           NSLog(@"Error creating asset: %@", error);
       

currentImagePath 来自[PHImageManager requesstImageDataForAsset:],提供了我要复制的照片的资产。在实际 iPad 上运行时,路径如下所示:

     file:///var/mobile/Media/DCIM/101IMPRT/IMG_1258.JPG

在模拟器中运行时是这样的:

     file:///Users/<my-name>/Library/Developer/CoreSimulator/Devices/<long UUID-type code>/data/Media/PhotoData/Mutations/DCIM/100APPLE/IMG_0002/Adjustments/FullSizeRender.jpg

在创建请求时收到错误:

错误信息

无法从文件 Error Domain=NSCocoaErrorDomain 创建数据 Code=257 "操作无法完成。(Cocoa 错误 257.)" 用户信息=0x17046ac40 NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0042.JPG, NSUnderlyingError=0x1702480a0 "操作无法完成。 不允许操作”

有趣的是,如果我将 UIImage* 与函数 [PHAssetChangeRequest creationReqeustForAssetFromImage:] 一起使用,则所有平台上的创建请求都会成功。

如果有人能解释发生了什么,我将不胜感激。是否与将照片存储在云端有关?我曾尝试在 iPad 上为照片关闭 iCloud,但仍然遇到相同的行为。

【问题讨论】:

【参考方案1】:

作为参考,如果您使用的是云端,您可能需要使用networkAccessAllowed: Bool: 这将检查您是否可以在必要时从云端下载图像。

我不确定您的问题的确切背景,因为这篇文章有点不清楚。你查字典resultHandler函数调用有没有错误

func requestImageForAsset(_ asset: PHAsset!,
               targetSize targetSize: CGSize,
              contentMode contentMode: PHImageContentMode,
                  options options: PHImageRequestOptions!,
            resultHandler resultHandler: ((UIImage!,
                [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID

在编辑资产之前,使用其canPerformEditOperation 方法查看资产是否允许编辑。

“要编辑资产的图像或视频内容,首先使用资产的 requestContentEditingInputWithOptions:completionHandler: 方法开始内容编辑会话。您可以通过在更改块中设置更改请求的 contentEditingOutput 属性来提交内容编辑。有关更多信息有关资产内容编辑的信息,请参阅PHAsset Class Reference。”

【讨论】:

感谢您的回复。我确实检查了允许的网络访问。结果处理程序没有给出错误。并检查了canPerformEditOperation。为了让问题更清楚,我没有展示我的所有代码;猜猜那没用? 没问题。您是否有理由要使用 URL 而不是带有 creationRequestForAssetFromImage(YourImageHere) 的图像。我相信这会将图像保存到相册中,而不是复制它。从照片库复制另一张照片到底是什么意思? 我试图设置 IPTC 元数据,但不想丢失现有的 EXIF 和 IPTC 元数据。据我了解,图像没有元数据。

以上是关于iOS 8 照片库 - 使用 PHAssetChangeRequest 添加资产时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 8 中编辑照片:允许“YourApp”修改这张照片?

如何使用 Photos API 在 iOS 8.0 中检索照片扩展名 (jpg/png)?

ios 8,如何使用 ALAssetLibrary 获取所有照片来替换丢失的相机胶卷相册

iOS 8 Beta 5 Safari 多张照片上传

iOS 8 - 禁用 iCloud 照片共享活动

iOS 8 照片框架:从 PHAsset 获取文件名