Use UIActivityViewController para compartilhar todos os tipos de arquivos

Eu quero usarUIActivityViewController para compartilhar arquivos do meu aplicativo iOS. A principal questão para mim é como lidar com diferentes tipos de arquivos.

O que eu tenho até agora:

Imagens

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

Não sei se pelo aspecto do gerenciamento de memória é uma boa ideia carregar a imagem de uma só vez. O que acontecerá se a imagem for muito grande para retê-la completamente na RAM? Vejoaqui por exemplo.

Cordas

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

Apenas texto.

NSUrl

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

Aqui, na maioria dos casos, o mesmo aplicativo aparece. Mas, por exemplo, o leitor de PDF não aparece para um arquivo PDF. A visualização no correio do outro lado mostra o Adobe Acrobat.

Tudo

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

A última abordagem tem a desvantagem de que nem todos os aplicativos são exibidos, o que, por exemplo, pode abrir um arquivo PDF. Além dissoesta aplica-se.

Eu quero usar todos os tipos de arquivos. Eu não acho que uma subclasse deUIActivity ajudaria aqui. Talvez um sublcass deUIActivityItemProvider?

Nota lateral: Você também pode postar suas soluções no Objective C / Swift.

questionAnswers(1)

yourAnswerToTheQuestion