【问题标题】:How to share files for open-in-place on iOS如何在 iOS 上共享文件以进行就地打开
【发布时间】:2019-10-24 14:10:20
【问题描述】:

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

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

这可行,但所有第三方编辑器都显示为复制到……,而不是在……中打开

我们还在应用的 info.plist 中将 UIFileSharingEnabledLSSupportsOpeningDocumentsInPlace 属性设置为 YES,但它们似乎仅在共享驻留在应用的 Documents 中的文件时与就地打开相关文件夹。

现在我们偶然发现了NSItemProviderNSItemProviderFileOptionOpenInPlace 选项。由于我们已经在支持文件提供程序扩展,而且从 Apple 的文档来看,这似乎是完成我们想要的事情的好地方。

添加“纯”NSItemProvider 在某种程度上有效,但显示的选项比同时共享文件 URL 和文本时更少(这是预期的)。但是,当我们将-[NSItemProvider registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:] 与上述选项一起使用(或仅为零,相同的结果)并在loadHandlercompletionHandler() 中返回文件URL 时,将不再共享任何内容。例如,Mail 不再附加文件,Messages 不再显示要发送的文档。

这些是代码的相关位:

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 的描述非常稀少,除了官方文档外,我们在 Internet 上的其他地方找不到任何信息。

【问题讨论】:

  • 请阅读此链接stackoverflow.com/questions/3981199/… 可能会有所帮助
  • 谢谢@Gagan_iOS。但是,这已经很好了。人们可以在我们的应用程序中打开他们的文档。我们想展示我们内部的其他应用程序并允许就地打开。我们不做编辑器,我们做存储。
  • 我发现我的问题是:对活动视图控制器和文件提供者之间的关系理解不够深入。

标签: ios objective-c share


【解决方案1】:

我发现我的问题是:对活动视图控制器和文件提供者之间的关系理解不够深入。

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

【讨论】:

  • 您是否能够访问这些文件?我正在尝试做类似的事情,但无法弄清楚如何从我的应用程序内部访问这些文件。基本上,我们希望允许用户将 word 文档发送到 word 进行编辑,而不需要可怕的本地副本保存。如果我们真的可以使用 UIActivityViewController 发送一个文档,其中 url 是共享位置的,那么我们是否必须在父应用程序中使用 File Provider 扩展。
  • 是的,在共享容器中使用正确的文件路径,我们的应用始终可以访问自己的文件。为了共享,我们正在创建一个临时副本(不是符号链接,它似乎不起作用)并共享该副本,以便我们获得一个命名良好的文件 URL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多