Freigeben über


Startprogramm

Browse sample. Durchsuchen Sie das Beispiel

In diesem Artikel wird beschrieben, wie Sie die .NET Multi-Platform App UI (.NET MAUI) ILauncher-Schnittstelle verwenden können. Mit dieser Schnittstelle können Anwendungen durch das System einen URI öffnen. Diese Methode zum Öffnen einer Anwendung wird häufig für Deep Linking für benutzerdefinierte URI-Schemas einer anderen Anwendung verwendet.

Die Standardimplementierung der ILauncher-Schnittstelle ist über die Launcher.Default-Eigenschaft verfügbar. Die ILauncher-Schnittstelle sowie die Launcher-Klasse sind im Microsoft.Maui.ApplicationModel-Namespace enthalten.

Wichtig

Um den Browser auf einer Website zu öffnen, verwenden Sie stattdessen die Browser-API.

Erste Schritte

Für den Zugriff auf die Startprogramm-Funktionalität ist die folgende plattformspezifische Einrichtung erforderlich.

Wenn Sie Deep-Links verwenden möchten, um andere Android-Apps zu öffnen, sollten Sie einen Intent-Filter in Ihrer App definieren. Dies kann durch Hinzufügen des folgenden XML zur Datei Platforms/Android/AndroidManifest.xml erreicht werden:

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

Die <data>-Elemente sind die URI-Schemas, die bereits in Ihrer App registriert wurden. Sie können keine Schemas verwenden, die nicht im Intent-Filter definiert sind.

Damit Ihre App aus anderen Apps durchsucht werden kann, deklarieren Sie ein <data>-Element mit dem android:scheme-Attribut:

<data android:scheme="appName"/>

Öffnen einer anderen App

Um die Startprogramm-Funktionalität zu nutzen, rufen Sie die Methode ILauncher.OpenAsync auf, und geben Sie String oder Uri zum Darstellen der zu öffnenden App an. Optional lässt sich mit der ILauncher.CanOpenAsync(Uri)-Methode überprüfen, ob das URI-Schema von einer App auf dem Gerät verarbeitet werden kann. Der folgende Code veranschaulicht, wie Sie überprüfen, ob ein URI-Schema unterstützt wird oder nicht, und öffnet dann den URI:

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

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

Das vorherige Codebeispiel kann mit dem TryOpenAsync(Uri) vereinfacht werden, das überprüft, ob das URI-Schema geöffnet werden kann, bevor es geöffnet wird:

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

if (launcherOpened)
{
    // Do something fun
}

Öffnen einer anderen App über eine Datei

Das Startprogramm kann auch verwendet werden, um eine App mit einer ausgewählten Datei zu öffnen. .NET MAUI erkennt automatisch den Dateityp (MIME) und öffnet die Standard-App für diesen Dateityp. Wenn mehrere Apps beim Dateityp registriert sind, wird dem Benutzer ein App-Auswahl-Popover angezeigt.

Im folgenden Codebeispiel wird Text in eine Datei geschrieben und die Textdatei mit dem Startprogramm geöffnet:

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

Festlegen des Speicherorts für das Startprogramm

Wichtig

Dieser Abschnitt gilt nur für iPadOS.

Wenn Sie unter iPadOS eine Freigabe oder ein Startprogramm anfordern, haben Sie die Möglichkeit, die Präsentation in einem Popover zu zeigen. Damit wird angegeben, wo das Popover angezeigt wird, und mit einem Pfeil direkt darauf verwiesen. Oftmals ist dies das Steuerelement, mit dem die Aktion gestartet wurde. Sie können den Speicherort mithilfe der PresentationSourceBounds-Eigenschaft angeben:

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

Alles, was hier beschrieben wird, funktioniert gleichermaßen für Share und Launcher.

Hier ist eine Erweiterungsmethode, mit der die Grenzen einer Ansicht berechnet werden:

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

Diese können dann beim Aufruf von RequestAsync verwendet werden:

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

Sie können das aufrufende Element übergeben, wenn der Command ausgelöst wird:

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

Ein Beispiel für die ViewHelpers-Klasse finden Sie im .NET MAUI-Beispiel, das auf GitHub gehostet wird.

Plattformunterschiede

In diesem Abschnitt werden die plattformspezifischen Unterschiede mit der Startprogramm-API beschrieben.

Die von CanOpenAsync zurückgegebene Task wird sofort abgeschlossen.