Compartilhar via


Inicializador

Browse sample. Navegue pelo exemplo

Este artigo descreve como você pode usar a interface .NET Multi-platform App UI (.NET MAUI). ILauncher Essa interface permite que um aplicativo abra um URI pelo sistema. Essa maneira de abrir um aplicativo geralmente é usada ao fazer links profundos em esquemas de URI personalizados de outro aplicativo.

A implementação padrão da interface está disponível por meio da ILauncher Launcher.Default propriedade. A interface e Launcher a ILauncher classe estão contidas no Microsoft.Maui.ApplicationModel namespace.

Importante

Para abrir o navegador para um site, use a API do navegador .

Introdução

Para acessar a funcionalidade do iniciador, é necessária a seguinte configuração específica da plataforma.

Se você quiser usar links diretos para abrir outros aplicativos Android, defina um filtro de intenção em seu aplicativo. Isso pode ser obtido adicionando o seguinte XML ao arquivo Platforms/Android/AndroidManifest.xml

<activity android:name="appName" android:exported="true">
    <intent-filter>
       <action android:name="android.intent.action.VIEW" />
       <category android:name="android.intent.category.DEFAULT" />
       <category android:name="android.intent.category.BROWSABLE" />
       <data android:scheme="lyft"/>
       <data android:scheme="fb"/>
       </intent-filter>
</activity>

Os <data> elementos são os esquemas de URI pré-registrados em seu aplicativo. Não é possível usar esquemas que não estejam definidos no filtro de intenção.

Para tornar seu aplicativo navegável a partir de outros aplicativos, declare um <data> elemento com o android:scheme atributo:

<data android:scheme="appName"/>

Abrir outro aplicativo

Para usar a funcionalidade Iniciador, chame o método e passe um String ou Uri representando o ILauncher.OpenAsync aplicativo para abrir. Opcionalmente, o método pode ser usado para verificar se o ILauncher.CanOpenAsync(Uri) esquema de URI pode ser manipulado por um aplicativo no dispositivo. O código a seguir demonstra como verificar se um esquema de URI é suportado ou não e, em seguida, abre o URI:

bool supportsUri = await Launcher.Default.CanOpenAsync("lyft://");

if (supportsUri)
    await Launcher.Default.OpenAsync("lyft://ridetype?id=lyft_line");

O exemplo de código anterior pode ser simplificado usando o , que verifica se o TryOpenAsync(Uri)esquema de URI pode ser aberto, antes de abri-lo:

bool launcherOpened = await Launcher.Default.TryOpenAsync("lyft://ridetype?id=lyft_line");

if (launcherOpened)
{
    // Do something fun
}

Abrir outro aplicativo por meio de um arquivo

O iniciador também pode ser usado para abrir um aplicativo com um arquivo selecionado. O .NET MAUI detecta automaticamente o tipo de arquivo (MIME) e abre o aplicativo padrão para esse tipo de arquivo. Se mais de um aplicativo estiver registrado com o tipo de arquivo, um popover de seleção de aplicativo será mostrado ao usuário.

O exemplo de código a seguir grava texto em um arquivo e abre o arquivo de texto com o iniciador:

string popoverTitle = "Read text file";
string name = "File.txt";
string file = System.IO.Path.Combine(FileSystem.CacheDirectory, name);

System.IO.File.WriteAllText(file, "Hello World");

await Launcher.Default.OpenAsync(new OpenFileRequest(popoverTitle, new ReadOnlyFile(file)));

Definir o local do iniciador

Importante

Esta seção só se aplica ao iPadOS.

Ao solicitar um compartilhamento ou abrir o iniciador no iPadOS, você pode apresentá-lo em um popover. Isso especifica onde o popover aparecerá e aponte uma seta diretamente. Esse local geralmente é o controle que iniciou a ação. Você pode especificar a localização usando a propriedade PresentationSourceBounds:

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

Tudo descrito aqui funciona igualmente para Share e Launcher.

Aqui está um método de extensão que ajuda a calcular os limites de uma exibição:

public static class ViewHelpers
{
    public static Rect GetAbsoluteBounds(this Microsoft.Maui.Controls.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 Microsoft.Maui.Controls.View v)
            {
                absoluteX += v.X + v.Margin.Top;
                absoluteY += v.Y + v.Margin.Left;
            }
        }

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

Isso pode ser usado ao chamar RequestAsync:

public Command<Microsoft.Maui.Controls.View> ShareCommand { get; } = new Command<Microsoft.Maui.Controls.View>(Share);

async void Share(Microsoft.Maui.Controls.View element)
{
    try
    {
        await Share.Default.RequestAsync(new ShareTextRequest
        {
            PresentationSourceBounds = element.GetAbsoluteBounds(),
            Title = "Title",
            Text = "Text"
        });
    }
    catch (Exception)
    {
        // Handle exception that share failed
    }
}

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

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

Para obter um exemplo da ViewHelpers classe, consulte o .NET MAUI Sample hospedado no GitHub.

Diferenças de plataforma

Esta seção descreve as diferenças específicas da plataforma com a API do iniciador.

O Task retorno de CanOpenAsync é concluído imediatamente.