Как поделиться файлами для открытого на iOS - PullRequest
0 голосов
/ 24 октября 2019

У нас есть приложение для 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 крайне скудно, и мы не смогли найти никакой другой информации в Интернете, кроме официальной документации.

...