如何在iOS系统上分享文件进行就地开机?

问题描述 投票:0回答:1

我们有一个iOS应用程序,通过Core Data管理文件。实际的文件驻留在应用程序的共享容器中,这样应用程序的文件提供者扩展也可以访问它们,以支持Files.app。我们希望给用户提供在第三方应用程序中打开这些文件的选项,以便他们可以就地编辑这些文件,而不是将副本发送到其他应用程序。

我们提供了一个 UIActivityViewController 用于与其他应用程序共享文件。我们还提供了一个 UIActivity 显示出 UIDocumentInteractionController 在某些情况下似乎效果更好。我们给出的是 UIActivityViewController 文档的文件URL、原始文本内容和可打印数据。

这可以工作,但所有的第三方编辑器都显示为 复制到... 而不是 开在...

我们还设置了 UIFileSharingEnabledLSSupportsOpeningDocumentsInPlace 属性,以 YES 中,但它们似乎只与共享驻留在应用程序的info.plist中的文件时的原地打开有关。Documents 文件夹。

现在我们已经偶然发现了 NSItemProviderFileOptionOpenInPlace 的选择 NSItemProvider. 由于我们已经支持文件提供者的扩展名,从苹果的文档来看,这似乎是一个很好的地方来实现我们想要的东西。

添加一个 "纯" NSItemProvider 工作,在某种程度上,但显示的选项比共享文件URL和文本时少(这是预期的)。然而,当我们使用 -[NSItemProvider registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:] 选项(或只用零,结果一样),并返回文件URL中的 loadHandler's 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 是要用?还是我们根本用错了?苹果的描述极其稀少,除了官方文档,我们在互联网上其他地方找不到任何信息。

ios objective-c share
1个回答
0
投票

我已经找到了我的问题所在。对活动视图控制器和文件提供者之间的关系理解不够深刻。

由于我所有的文件都驻留在共享容器中,并且也是通过文件提供者扩展名发布的,所以我需要通过活动视图控制器共享的是通过文件提供者扩展名共享的完全相同的URL。从技术上讲,打开文件的应用程序就会通过文件提供者机制访问它。

© www.soinside.com 2019 - 2024. All rights reserved.