2016-10-11 2 views
0

Я создаю расширение UIDocumentPicker на iOS в первый раз. Я заполнил подкласс UIDocumentPickerExtensionViewController с помощью соответствующих методов. В моем пользовательском интерфейсе, когда пользователь выбирает документ из моего расширения, я могу успешно скопировать указанное изображение в каталог документа. Соответствующий код:`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:&copyError]; 

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

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

вещи я попытался:

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

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

ответ

0

Когда вы создаете новое расширение поставщика документов (по крайней мере, в 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:&fileError]; 

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

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

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

При том, что ваш провайдер документ правильно в виде дождя.

Смежные вопросы