【发布时间】:2019-10-24 14:10:20
【问题描述】:
我们有一个通过 Core Data 管理文档的 iOS 应用程序。实际文件驻留在应用程序的共享容器中,因此应用程序的文件提供程序扩展也可以访问它们以获得 Files.app 支持。我们希望为用户提供在第三方应用中打开这些文件的选项,以便他们可以就地编辑它们,而不是向其他应用发送副本。
我们提供UIActivityViewController 用于与其他应用共享文件。我们还提供了一个UIActivity,它显示了一个UIDocumentInteractionController,在某些情况下似乎效果更好。我们将文档的文件 URL、原始文本内容和可打印数据提供给 UIActivityViewController。
这可行,但所有第三方编辑器都显示为复制到……,而不是在……中打开
我们还在应用的 info.plist 中将 UIFileSharingEnabled 和 LSSupportsOpeningDocumentsInPlace 属性设置为 YES,但它们似乎仅在共享驻留在应用的 Documents 中的文件时与就地打开相关文件夹。
现在我们偶然发现了NSItemProvider 的NSItemProviderFileOptionOpenInPlace 选项。由于我们已经在支持文件提供程序扩展,而且从 Apple 的文档来看,这似乎是完成我们想要的事情的好地方。
添加“纯”NSItemProvider 在某种程度上有效,但显示的选项比同时共享文件 URL 和文本时更少(这是预期的)。但是,当我们将-[NSItemProvider registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:] 与上述选项一起使用(或仅为零,相同的结果)并在loadHandler 的completionHandler() 中返回文件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