`UIDocumentPickerExtensionViewController`: это изображение неподтвержденного типа

#ios #ios-extensions

#iOS #ios-расширения

Вопрос:

Я впервые создаю расширение UIDocumentPicker на iOS. Я заполнил UIDocumentPickerExtensionViewController подкласс соответствующими методами. В моем пользовательском интерфейсе, когда пользователь выбирает документ из моего расширения, я могу успешно скопировать соответствующее изображение в каталог документов. Соответствующий код:

 NSURL *sourceURL = [item imageUrlWithPath:image.fullSizeImagePath];
NSString *filename = [NSString stringWithFormat:@"%@.jpg", item.title ?: NSLocalizedString(@"NO_TITLE", nil)];
NSURL *targetURL = [self.documentStorageURL URLByAppendingPathComponent:filename];

NSError *copyError = nil;
BOOL success = [fm copyItemAtURL:sourceURL toURL:targetURL error:amp;copyError];

if (success) {
    [self dismissGrantingAccessToURL:targetURL];
} else {
    NSLog(@"Error! %@", copyError);
}
  

Все идет нормально в соответствии с приведенным выше путем к коду, однако после выбора и вызова пользовательский dismissGrantingAccessToURL: интерфейс отклоняется, но я получаю предупреждение от хост-приложения (в данном случае Pages) о том, что изображение не может быть вставлено, поскольку «Это изображение изнеподдерживаемый тип. «

Вещи, которые я пробовал:

  • Попробуйте использовать имя файла с другим расширением
  • Использовались варианты разных эскизов моего изображения
  • Повторно сжал изображение в новый файл.

Все безрезультатно. Почему мой файл не может быть прочитан другими приложениями?

Ответ №1:

Когда вы создаете новое расширение поставщика документов (по крайней мере, в Xcode 8), Apple создает дополнительное расширение, называемое поставщиком файлов. Это отдельное расширение, независимое от пользовательского интерфейса, для извлечения файла из удаленной службы, такой как сервер. Это полезно в тех случаях, когда файл физически не находится на устройстве, но вы все равно хотите, чтобы пользователь мог импортировать его в основное приложение.

Неприятным побочным эффектом этого является то, что Apple также написала некоторый код-заглушку, подкласс NSFileProviderExtension . Если вы найдете этот класс (по умолчанию FileProvider ), есть метод startProvidingItemAtURL:completionHandler: . Этот метод содержит некоторый предварительно обработанный код, который Apple добавила туда:

 - (void)startProvidingItemAtURL:(NSURL *)url completionHandler:(void (^)(NSError *))completionHandler {

    // Should ensure that the actual file is in the position returned by URLForItemWithIdentifier:, then call the completion handler
    NSError *fileError = nil;

    // TODO: get the contents of file at <url> from model
    NSData *fileData = [NSData data];

    [fileData writeToURL:url options:0 error:amp;fileError];

    if (completionHandler) {
        completionHandler(nil);
    }
}
  

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

 - (void)startProvidingItemAtURL:(NSURL *)url completionHandler:(void (^)(NSError *))completionHandler {
    if (completionHandler) {
        completionHandler(nil);
    }
}
  

При этом ваш поставщик документов прав, как дождь.