Use UIActivityViewController to share all types of files

蓝咒 提交于 2020-01-11 04:12:07

问题


I want to use UIActivityViewController to share files from my iOS app. The main question for me is how do I handle different file types.

What I'v got so far:

Images

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);
    }
}

Don't know if from the memory management aspect it is a good idea to load the image at once. What will happen if the image is too big for holding it completely in RAM? See here for example.

Strings

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

Only text.

NSUrl

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

Here in most cases the same app appear. But for example the PDF reader doesn't appear for a PDF file. The preview in mail on the other side shows Adobe Acrobat.

Everything

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

The last approach has the disadvantage that not all apps are displayed, which for example could open a PDF file. Also this applies.

I want to use all types of files. I don't think a subclass of UIActivity would help here. Perhaps a sublcass of UIActivityItemProvider?

Side note: You can also post your solutions in Objective C/Swift.


回答1:


I tried to implement UIActivityItemProvider, but here again not all apps where shown for the corresponding filetype. E.g. for a docx-document Word was not shown.

Now I switched to UIDocumentInteractionController and now there are many apps available.

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 there are too many apps, because the file type xml should not be really be supported by a PDF reader, but it is. Nevertheless, it seems to work now thanks to this post:

In general if you’re sharing an image or url, you might want to use a UIActivityViewController. If you’re sharing a document, you might want to use a UIDocumentInteractionController.



来源:https://stackoverflow.com/questions/39666466/use-uiactivityviewcontroller-to-share-all-types-of-files

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!