Condividi tramite


Launcher

Browse sample. Esplorare l'esempio

Questo articolo descrive come usare l'interfaccia dell'interfaccia utente dell'app multipiattaforma .NET (.NET MAUI). ILauncher Questa interfaccia consente a un'applicazione di aprire un URI dal sistema. Questo modo di aprire un'applicazione viene spesso usato quando si esegue il deep linking negli schemi URI personalizzati di un'altra applicazione.

L'implementazione predefinita dell'interfaccia ILauncher è disponibile tramite la Launcher.Default proprietà . Sia l'interfaccia che Launcher la ILauncher classe sono contenute nello spazio dei Microsoft.Maui.ApplicationModel nomi .

Importante

Per aprire il browser in un sito Web, usare invece l'API Browser .

Introduzione

Per accedere alla funzionalità di avvio, è necessaria la configurazione specifica della piattaforma seguente.

Se vuoi usare collegamenti diretti per aprire altre app Android, devi definire un filtro finalità nell'app. A tale scopo, è possibile aggiungere il codice XML seguente al file 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>

Gli <data> elementi sono gli schemi URI preregistrati con l'app. Non è possibile usare schemi non definiti nel filtro finalità.

Per rendere l'app esplorabile da altre app dichiarare un <data> elemento con l'attributo android:scheme :

<data android:scheme="appName"/>

Aprire un'altra app

Per usare la funzionalità Launcher, chiamare il ILauncher.OpenAsync metodo e passare un String oggetto o Uri che rappresenta l'app da aprire. Facoltativamente, il ILauncher.CanOpenAsync(Uri) metodo può essere usato per verificare se lo schema URI può essere gestito da un'app nel dispositivo. Il codice seguente illustra come verificare se uno schema URI è supportato o meno e quindi apre l'URI:

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

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

L'esempio di codice precedente può essere semplificato usando , TryOpenAsync(Uri)che controlla se lo schema URI può essere aperto, prima di aprirlo:

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

if (launcherOpened)
{
    // Do something fun
}

Aprire un'altra app tramite un file

L'utilità di avvio può essere usata anche per aprire un'app con un file selezionato. .NET MAUI rileva automaticamente il tipo di file (MIME) e apre l'app predefinita per quel tipo di file. Se più app sono registrate con il tipo di file, viene visualizzato un popover di selezione dell'app all'utente.

L'esempio di codice seguente scrive testo in un file e apre il file di testo con l'utilità di avvio:

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

Impostare il percorso dell'utilità di avvio

Importante

Questa sezione si applica solo a iPadOS.

Quando si richiede una condivisione o si apre un'utilità di avvio in iPadOS, è possibile presentarla in un popover. Specifica dove verrà visualizzato il popover e puntare direttamente una freccia. Questa posizione è spesso il controllo che ha avviato l'azione. È possibile specificare la posizione usando la proprietà 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
    });

Tutti gli elementi descritti qui funzionano allo stesso modo per Share e Launcher.

Ecco un metodo di estensione che consente di calcolare i limiti di una visualizzazione:

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

Questa operazione può quindi essere usata quando si chiama 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
    }
}

È possibile passare l'elemento chiamante quando Command viene attivato:

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

Per un esempio della ViewHelpers classe , vedere l'esempio DI MAUI .NET ospitato in GitHub.

Differenze tra le piattaforme

Questa sezione descrive le differenze specifiche della piattaforma con l'API di avvio.

Oggetto Task restituito da CanOpenAsync viene completato immediatamente.