3

尝试使用[PHAssetChangeRequest creationReqeustForAssetFromImageAtFileURL:]. 我正在尝试通过首先获取第一张照片的路径名来从照片库中复制另一张照片。

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

我的代码片段

    [[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。)” UserInfo=0x17046ac40 {NSFilePath=/var/mobile/Media/DCIM/100APPLE/IMG_0042.JPG, NSUnderlyingError=0x1702480a0 "操作无法完成。操作不允许"}

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

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

4

1 回答 1

0

作为参考,如果您使用的是云,您可能需要使用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 类参考。”

于 2015-05-20T22:13:07.780 回答