Xamarin.Essentials: SelectorXamarin.Essentials: Launcher

La clase Launcher permite que una aplicación abra un URI por el sistema.The Launcher class enables an application to open a URI by the system. A menudo se usa al vincular en profundidad en los esquemas de URI personalizados de otra aplicación.This is often used when deep linking into another application's custom URI schemes. Si quiere abrir el explorador en un sitio web, debe hacer referencia a la API Browser .If you are looking to open the browser to a website then you should refer to the Browser API.

Primeros pasosGet started

Para empezar a usar esta API, lea la guía de introducción para Xamarin.Essentials con el fin de asegurarse de que la biblioteca está correctamente instalada y configurada en los proyectos.To start using this API, read the getting started guide for Xamarin.Essentials to ensure the library is properly installed and set up in your projects.

Uso de LauncherUsing Launcher

Agregue una referencia a Xamarin.Essentials en la clase:Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

Para usar la funcionalidad Launcher, llame al método OpenAsync y pase un string o Uri para abrirla.To use the Launcher functionality call the OpenAsync method and pass in a string or Uri to open. Si quiere, el método CanOpenAsync se puede usar para comprobar si el esquema de URI se puede administrar desde una aplicación del dispositivo.Optionally, the CanOpenAsync method can be used to check if the URI schema can be handled by an application on the device.

public class LauncherTest
{
    public async Task OpenRideShareAsync()
    {
        var supportsUri = await Launcher.CanOpenAsync("lyft://");
        if (supportsUri)
            await Launcher.OpenAsync("lyft://ridetype?id=lyft_line");
    }
}

Esto se puede combinar en una sola llamada con TryOpenAsync, que comprueba si se puede abrir el parámetro y, si es así, lo abre.This can be combined into a single call with TryOpenAsync, which checks if the parameter can be opened and if so open it.

public class LauncherTest
{
    public async Task<bool> OpenRideShareAsync()
    {
        return await Launcher.TryOpenAsync("lyft://ridetype?id=lyft_line");
    }
}

Configuración de una plataforma adicionalAdditional Platform Setup

Sin configuración adicional.No additional setup.

ArchivosFiles

Esta característica permite a una aplicación solicitar a otras que abran y vean un archivo.This features enables an app to request other apps to open and view a file. Xamarin.Essentials detectará automáticamente el tipo de archivo (MIME) y solicitará su apertura.Xamarin.Essentials will automatically detect the file type (MIME) and request the file to be opened.

A continuación se muestra un ejemplo de cómo escribir texto y cómo solicitar la apertura:Here is a sample of writing text to disk and requesting it be opened:

var fn = "File.txt";
var file = Path.Combine(FileSystem.CacheDirectory, fn);
File.WriteAllText(file, "Hello World");

await Launcher.OpenAsync(new OpenFileRequest
{
    File = new ReadOnlyFile(file)
});

Ubicación de presentación al abrir archivosPresentation Location When Opening Files

Al solicitar un recurso compartido o abrir el iniciador en iPadOS, tiene la posibilidad de presentar un control emergente.When requesting a share or opening launcher on iPadOS you have the ability to present in a pop over control. Esto especifica dónde aparecerá la ventana emergente y dónde apuntará directamente una flecha.This specifies where the pop over will appear and point an arrow directly to. Esta ubicación suele ser el control que inició la acción.This location is often the control that launched the action. Puede especificar la ubicación con la propiedad PresentationSourceBounds:You can specify the location using the PresentationSourceBounds property:

await Share.RequestAsync(new ShareFileRequest
{
    Title = Title,
    File = new ShareFile(file),
    PresentationSourceBounds = DeviceInfo.Platform== DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                            ? new System.Drawing.Rectangle(0, 20, 0, 0)
                            : System.Drawing.Rectangle.Empty
});
await Launcher.OpenAsync(new OpenFileRequest
{
    File = new ReadOnlyFile(file),
    PresentationSourceBounds = DeviceInfo.Platform== DevicePlatform.iOS && DeviceInfo.Idiom == DeviceIdiom.Tablet
                            ? new System.Drawing.Rectangle(0, 20, 0, 0)
                            : System.Drawing.Rectangle.Empty
});

Todo lo que se describe aquí funciona igual para Share y Launcher.Everything described here works equally for Share and Launcher.

Si usa Xamarin.Forms, podrá pasar View y calcular los límites:If you are using Xamarin.Forms you are able to pass in a View and calculate the bounds:

public static class ViewHelpers
{
    public static Rectangle GetAbsoluteBounds(this Xamarin.Forms.View element)
    {
        Element looper = element;

        var absoluteX = element.X + element.Margin.Top;
        var absoluteY = element.Y + element.Margin.Left;

        // Add logic to handle titles, headers, or other non-view bars

        while (looper.Parent != null)
        {
            looper = looper.Parent;
            if (looper is Xamarin.Forms.View v)
            {
                absoluteX += v.X + v.Margin.Top;
                absoluteY += v.Y + v.Margin.Left;
            }
        }

        return new Rectangle(absoluteX, absoluteY, element.Width, element.Height);
    }

    public static System.Drawing.Rectangle ToSystemRectangle(this Rectangle rect) =>
        new System.Drawing.Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height);
}

Después, se puede usar al llamar a RequstAsync:This can then be used when calling RequstAsync:

public Command<Xamarin.Forms.View> ShareCommand { get; } = new Command<Xamarin.Forms.View>(Share);
async void Share(Xamarin.Forms.View element)
{
    try
    {
        Analytics.TrackEvent("ShareWithFriends");
        var bounds = element.GetAbsoluteBounds();

        await Share.RequestAsync(new ShareTextRequest
        {
            PresentationSourceBounds = bounds.ToSystemRectangle(),
            Title = "Title",
            Text = "Text"
        });
    }
    catch (Exception)
    {
        // Handle exception that share failed
    }
}

Puede pasar el elemento que realiza la llamada cuando se desencadene Command:You can pass in the calling element when the Command is triggered:

<Button Text="Share"
        Command="{Binding ShareWithFriendsCommand}"
        CommandParameter="{Binding Source={RelativeSource Self}}"/>

Diferencias entre plataformasPlatform Differences

La tarea devuelta desde CanOpenAsync se completa de inmediato.The Task returned from CanOpenAsync completes immediately.

APIAPI

Encuentre más vídeos de Xamarin en Channel 9 y YouTube.Find more Xamarin videos on Channel 9 and YouTube.