【问题标题】:Do I have to download all iCloud files to be able to generate their thumbnails?我是否必须下载所有 iCloud 文件才能生成缩略图?
【发布时间】:2023-03-03 08:29:22
【问题描述】:

我正在枚举 iCloud 驱动器元素 NSMetadataItem 并将它们存储在一个数组中。

文件在那里:通过查看 OS X 上的 iCloud 文件夹以及使用 UIDocumentPicker 的设备上的文件夹进行确认。

稍后在代码中,我尝试使用以下方法检索此类元素的缩略图:

// self.item is a NSMetadataItem
NSURL *fileURL = [self.item valueForAttribute:NSMetadataItemURLKey];

AVAsset *asset = [AVAsset assetWithURL:fileURL];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;

CMTime time = CMTimeMakeWithSeconds(1, 60);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
  if (result != AVAssetImageGeneratorSucceeded) {
    NSLog(@"couldn't generate thumbnail, error:%@", error);
  }
  
  // TODO Do something with the image
};

generator.maximumSize = size;
[generator generateCGImagesAsynchronouslyForTimes:@[[NSValue valueWithCMTime:time]]
                                completionHandler:handler];

我在处理程序中收到此错误:

无法生成缩略图,错误:Error Domain=NSURLErrorDomain Code=-1100 "在此服务器上未找到请求的 URL。" UserInfo={NSLocalizedDescription=未找到请求的 URL 此服务器。,NSUnderlyingError=0x15f82b2a0 {错误 Domain=NSPOSIXErrorDomain Code=2 "没有这样的文件或目录"}}

问题出在 URL 上,你说,但 URL 是直接从 `NSMetadataItem" 中提取的,并且具有格式

file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~myCompany~myApp/Documents/0%20-%20intro.mov

...在这种情况下,电影被称为0 - intro.mov

我尝试了 3 种其他方法来下载缩略图。没有任何作用。

突破

我现在发现我必须将 iCloud 驱动器上的所有文件(使用 startDownloadingUbiquitousItemAtURL:error:)下载到设备上才能生成它们的缩略图,这似乎很疯狂。想象一下远程拥有数 GB 的视频,并且必须下载所有文件才能显示其缩略图。

它必须以另一种方式存在。证据是UIDocumentPicker 显示了 iCloud 上所有视频的缩略图,而无需下载它们。

有什么线索吗?

【问题讨论】:

标签: ios icloud icloud-drive


【解决方案1】:

我认为问题是由于在找到 URL 后读取文件的权限引起的。但是,根据this answer,您应该能够通过以下方式做到这一点:

[url startAccessingSecurityScopedResource];

NSFileCoordinator *coordinator = [[NSFileCoordinator alloc] init];
__block NSError *error;
[coordinator coordinateReadingItemAtURL:url options:0 error:&error byAccessor:^(NSURL *newURL) {
    [newURL getResourceValue:&image forKey:NSURLThumbnailDictionaryKey error:&error];
}];

[url stopAccessingSecurityScopedResource];

【讨论】:

  • 由于某种原因,升级到 iOS 8.4.1 后,这不再工作了
  • 但是... 如果设备尚未在给定的 URL 下载文件,coordinateReadingItemAtURL 会在下载文件时阻塞。首先下载文件。
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 2019-01-04
  • 1970-01-01
  • 2015-12-06
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多