Нужно ли загружать все файлы 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];