使用UIActivityViewController共享所有类型的文件

我想使用UIActivityViewController从我的iOS应用程序共享文件。 我的主要问题是如何处理不同的文件类型。

到目前为止我得到了什么:

图片

 public void OpenInExternalApp(string filepath) { if (!File.Exists(filepath)) return; UIImage uiImage = UIImage.FromFile(filepath); // Define the content to share var activityItems = new NSObject[] { uiImage }; UIActivity[] applicationActivities = null; var activityController = new UIActivityViewController(activityItems, applicationActivities); if (UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone) { // Phone UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(activityController, true, null); } else { // Tablet var popup = new UIPopoverController(activityController); UIView view = UIApplication.SharedApplication.KeyWindow.RootViewController.View; CGRect rect = new CGRect(view.Frame.Width/2, view.Frame.Height, 50, 50); popup.PresentFromRect(rect, view, UIPopoverArrowDirection.Any, true); } } 

不知道从内存管理方面来看,一次加载图像是个好主意。 如果图像太大而无法将其完全保存在RAM中,会发生什么? 见这里的例子。

字符串

 var activityItems = new NSObject[] { UIActivity.FromObject(new NSString(text)) }; 

只有文字。

NSURL

 NSUrl url = NSUrl.CreateFileUrl(filepath, false, null); 

在大多数情况下,会出现相同的应用。 但是,例如PDF阅读器不会出现在PDF文件中。 另一方面的邮件预览显示Adobe Acrobat。

一切

 var activityItems = new NSObject[] { NSData.FromFile(filepath) }; 

最后一种方法的缺点是并非显示所有应用程序,例如可以打开PDF文件。 这也适用。

我想使用所有类型的文件。 我不认为UIActivity的子类会对此有所帮助。 也许是UIActivityItemProvider一个次级?

附注:您也可以在Objective C / Swift中发布您的解决方案。

我试图实现UIActivityItemProvider ,但这里并不是所有的应用程序都显示相应的文件类型。 例如,对于docx文档,Word未显示。

现在我切换到UIDocumentInteractionController ,现在有很多应用程序可用。

 UIDocumentInteractionController documentController = new UIDocumentInteractionController(); documentController.Url = new NSUrl(filepath, false); string fileExtension = Path.GetExtension(filepath).Substring(1); string uti = UTType.CreatePreferredIdentifier(UTType.TagClassFilenameExtension.ToString(), fileExtension, null); documentController.Uti = uti; UIView presentingView = UIApplication.SharedApplication.KeyWindow.RootViewController.View; documentController.PresentOpenInMenu(CGRect.Empty, presentingView, true); 

Imho有太多的应用程序,因为PDF阅读器不应该真正支持文件类型xml,但确实如此。 然而,由于这篇文章 ,它现在似乎工作:

通常,如果您要共享图像或URL,则可能需要使用UIActivityViewController。 如果您正在共享文档,则可能需要使用UIDocumentInteractionController。