У нас есть приложение для iOS, которое управляет документами через Core Data. Фактические файлы находятся в общем контейнере приложения, так что расширение поставщика файлов приложения также может получить к ним доступ для поддержки Files.app. Мы хотим дать пользователю возможность открывать эти файлы в сторонних приложениях, чтобы они могли редактировать их на месте вместо отправки копии в другое приложение.
Мы предоставляем UIActivityViewController
для обменафайлы с другими приложениями. Мы также предоставляем UIActivity
, который показывает UIDocumentInteractionController
, который, кажется, работает лучше в некоторых случаях. Мы даем UIActivityViewController
URL-адрес файла документа, необработанное текстовое содержимое и данные для печати.
Это работает, но все сторонние редакторы отображаются как Копировать в ... из Открыть в…
Мы также установили свойства UIFileSharingEnabled
и LSSupportsOpeningDocumentsInPlace
на YES
в info.plist приложения, но они кажутся релевантнымидля открытия на месте при совместном использовании файлов, находящихся в папке приложения Documents
.
Теперь мы наткнулись на параметр NSItemProviderFileOptionOpenInPlace
для NSItemProvider
. Поскольку мы уже поддерживаем расширение для файловых провайдеров и из документации Apple, это казалось отличным местом для достижения именно того, чего мы хотим.
Добавление «чистого» * 1027 * работает, в некотором смысле, но показывает меньшеварианты, чем когда также общий доступ к файлу URL и текст в дополнение (что ожидается). Однако, когда мы используем -[NSItemProvider registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:]
с указанным параметром (или просто ноль, тот же результат) и возвращаем URL файла в loadHandler
в completionHandler()
, ничего больше не передается. Например, Почта больше не прикрепляет файл, Сообщения не показывает документ для отправки.
Это соответствующие биты кода:
NSMutableArray *items = [NSMutableArray array];
NSMutableArray <UIActivity *> *activities = [NSMutableArray array];
NSURL *fileURL = self.record.metadata.fileURL;
NSString *fileUTI = self.record.metadata.uti;
NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithItem: fileURL typeIdentifier: fileUTI];
[itemProvider registerFileRepresentationForTypeIdentifier:fileUTI fileOptions:NSItemProviderFileOptionOpenInPlace visibility:YES loadHandler:^NSProgress * _Nullable(void (^ _Nonnull completionHandler)(NSURL * _Nullable, BOOL, NSError * _Nullable))
{
if (fileURL)
completionHandler(fileURL, YES, nil);
else
completionHandler(nil, YES, [NSError errorWithDomain:NSCocoaErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]);
return nil;
}];
[items addObject:itemProvider];
self.activityViewController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities];
[UIAppDelegate.splitViewController presentViewController:self.activityViewController animated:YES completion:nil];
Использование меню «Поделиться»Правильно вызывается обработчик загрузки провайдера, и возвращается реальный URL файла.
Разве не так NSItemProviderFileOptionOpenInPlace
предназначен для использования? Или мы используем это просто неправильно? Описание Apple крайне скудно, и мы не смогли найти никакой другой информации в Интернете, кроме официальной документации.