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

时间:2016-09-23 17:30:01

标签: ios xamarin xamarin.ios uiactivityviewcontroller file-sharing

我想使用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中,会发生什么?例如,请参阅here

字符串

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文件。同样this适用。

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

的次级升级

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

1 个答案:

答案 0 :(得分:4)

我尝试实现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,但确实如此。然而,由于this post

,它现在似乎有效
  

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