Нужно ли загружать все файлы iCloud, чтобы иметь возможность создавать их эскизы?

Я прочитал все ответы на переполнение стека об этой ошибке, и ни один не решил проблему, потому что мой вопрос немного отличается.

Я перечисляю элементы диска iCloud NSMetadataItem и хранить их в массиве.

Файлы есть: подтверждается просмотром папки iCloud на OS X, а также на устройстве с помощью 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];

Я получаю эту ошибку внутри обработчика:

не удалось создать миниатюру, ошибка: Ошибка Domain=NSURLErrorDomain Code=-1100 "Запрошенный URL-адрес не найден на этом сервере." UserInfo={NSLocalizedDescription= Запрошенный URL-адрес не найден на этом сервере., NSUnderlyingError=0x15f82b2a0 {Ошибка домена =NSPOSIXErrorDomain Code=2 "Нет такого файла или каталога"}}

вы говорите, проблема в URL, но URL извлекается непосредственно из NSMetadataItem и имеет вид

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

... в этом случае фильм называется 0 - intro.mov

Я попробовал 3 других метода, чтобы загрузить миниатюры. Ни один не работает.

Прорвать

Теперь я обнаружил, что мне нужно загрузить все файлы, которые находятся на диске iCloud (используя startDownloadingUbiquitousItemAtURL:error:) к устройству, чтобы иметь возможность генерировать свои эскизы, что кажется безумным. Представьте, что у вас есть несколько гигабайт видео удаленно, и вам нужно загрузить все файлы, чтобы показать их миниатюры.

Должно существовать по-другому. Доказательством является то, что UIDocumentPicker показывает эскизы всех видео, которые есть на iCloud, без их загрузки.

Есть какие-нибудь подсказки?

1 ответ

Решение

Я думаю, что проблема возникает из-за разрешений на чтение файлов после того, как URL были найдены. Однако, согласно этому ответу, вы должны сделать это со следующим:

[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];
Другие вопросы по тегам