如何在不重新保存的情况下从 iCloud 下载图像?

Posted

技术标签:

【中文标题】如何在不重新保存的情况下从 iCloud 下载图像?【英文标题】:How to download image from iCloud without re-saving it? 【发布时间】:2020-01-13 19:27:22 【问题描述】:

我在尝试从图库中挑选照片时遇到问题(当我挑选上传到 iCloud 上的图片时应用程序崩溃)。 所以我的第一个解决方案是检查图像是否在设备上,如果没有,然后从 iCloud 下载。

我用过这段代码

let manager = PHImageManager.default()
let requestOptions = PHImageRequestOptions()
requestOptions.resizeMode = .exact
requestOptions.deliveryMode = .highQualityFormat;

// Request Image
manager.requestImageData(for: asset, options: requestOptions, resultHandler:  (data, str, orientation, info) -> Void in
// Do somethign with Image Data
)

我在这种情况下获得了 imageData,但如果我想保存它,它会保存到 新照片。因此,我在照片中获得了图像的副本,而不是获得一个存储在设备上的原始图像

所以我的问题是如何下载图像无需重新保存。 基本上我想要与照片应用程序相同的行为(当照片不在设备上时,它会下载照片并将其保存到同一张照片中,而不是创建它的副本)

【问题讨论】:

【参考方案1】:

我遇到了这个问题,这里有一个解决方法:

isNetworkAccessAllowed 设置为false

requestOptions.isNetworkAccessAllowed = false

那是因为您需要确保我们不会从 iCloud 中获取它。此时如果没有下载图片,resultHandler中的data应该是nil

manager.requestImageData(for: PHAsset(), options: requestOptions, resultHandler:  (data, str, orientation, info) -> Void in
    if let fetchedData = data 
        // the image is already downloaded
     else 
        // the image is not downloaded...
        // now what you should do is to set isNetworkAccessAllowed to true
        // and make a new request to get it from iCloud.
    
)

此外,您可以利用PHImageResultIsInCloudKey

manager.requestImageData(for: PHAsset(), options: requestOptions, resultHandler:  (data, str, orientation, info) -> Void in
    if let keyNSNumber = info?[PHImageResultIsInCloudKey] as? NSNumber 
        if keyNSNumber.boolValue 
            // its on iCloud...
            // read the "keep in mind" below note,
            // now what you should do is to set isNetworkAccessAllowed to true
            // and make a new request.
         else 
            //
        
    
)

PHImageResultIsInCloudKey 文档中所述,请记住:

如果为 true,则未提供图片,因为资产数据必须是 从 iCloud 下载。要下载数据,请提交另一个请求, 并为 isNetworkAccessAllowed 选项指定 true。

【讨论】:

那么如果我设置了允许网络访问,那么照片将被下载到原始图像而不重新保存?

以上是关于如何在不重新保存的情况下从 iCloud 下载图像?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不先将对象作为文件保存到谷歌驱动器的情况下从谷歌 colab 下载对象作为文件?

Android:如何在不拍照的情况下从相机捕获文本?

如何在不启动容器的情况下从 dockerfile 创建图像 [重复]

如何在不引用文件的情况下从图像中获取字节数据

如何在不重新实现方法的情况下从外部接口继承接口

如何在不设置 Content-Disposition 标签的情况下从控制器返回图像?