Xamarin.Essentials:Lançador

A classe Launcher permite que um aplicativo abra um URI pelo sistema. Isso geralmente é utilizado quando a vinculação profunda é usada em esquemas de URI personalizados de outro aplicativo. Se quiser abrir o navegador em um site, confira a API do Browser.

Introdução

Para começar a usar essa API, leia o guia de introdução para Xamarin.Essentials garantir que a biblioteca esteja instalada e configurada corretamente em seus projetos.

Uso do Launcher

Adicione uma referência a Xamarin.Essentials em sua classe:

using Xamarin.Essentials;

Para usar a funcionalidade Launcher, chame o método OpenAsync e passe uma string ou Uri para abrir. Opcionalmente, o método CanOpenAsync pode ser usado para verificar se o esquema de URI pode ser tratado por um aplicativo no dispositivo.

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

Isso pode ser combinado em uma única chamada com TryOpenAsync, que verifica se o parâmetro pode ser aberto e, em caso afirmativo, abre-o.

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

Configuração adicional da plataforma

Nenhuma configuração adicional.

Arquivos

Esse recurso permite que um aplicativo solicite que outros aplicativos abram e exibam um arquivo. Xamarin.Essentials detectará automaticamente o tipo de arquivo (MIME) e solicitará que o arquivo seja aberto.

Aqui está um exemplo de gravação de texto em disco e solicitação para que ele seja aberto:

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

Local da apresentação ao abrir arquivos

Ao solicitar um inicializador de compartilhamento ou abertura no iPadOS, você tem a capacidade de apresentar em um controle pop-over. Isso especifica para onde o pop-over será exibido e apontará uma seta diretamente para. Esse local geralmente é o controle que iniciou a ação. Você pode especificar o local usando a PresentationSourceBounds propriedade :

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

Tudo descrito aqui funciona igualmente para Share e Launcher.

Se você estiver usando Xamarin.Forms , poderá passar um View e calcular os limites:

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

Em seguida, isso pode ser usado ao chamar RequestAsync:

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

Você pode passar o elemento de chamada quando o Command é disparado:

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

Diferenças entre plataformas

A Tarefa retornada de CanOpenAsync é concluída imediatamente.

API

Encontre mais vídeos sobre o Xamarin no Channel 9 e no YouTube.