#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);
}
}
При этом ваш поставщик документов прав, как дождь.