Xamarin.Essentials: Startprogramm

Mit der Launcher-Klasse kann eine Anwendung einen URI durch das System öffnen. Das wird häufig für Deep Linking für benutzerdefinierte URI-Schemas einer andere Anwendung verwendet. Wenn Sie im Browser eine Website öffnen möchten, verweisen Sie auf die Browser API.

Erste Schritte

Lesen Sie zum Einstieg in die Verwendung dieser API den Leitfaden mit ersten Schritte für Xamarin.Essentials, um sicherzustellen, dass die Bibliothek ordnungsgemäß installiert und in Ihren Projekten eingerichtet ist.

Verwenden des Startprogramms

Fügen Sie in Ihrer Klasse einen Verweis auf Xamarin.Essentials hinzu:

using Xamarin.Essentials;

Um die Launcher-Funktionalität zu nutzen, rufen Sie die Methode OpenAsync auf, und geben Sie string oder Uri zum Öffnen an. Optional lässt sich mit der CanOpenAsync-Methode überprüfen, ob das URI-Schema von einer Anwendung auf dem Gerät verarbeitet werden kann.

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

Dies kann mit TryOpenAsync zu einem einzelnen Aufruf kombiniert werden, der überprüft, ob der Parameter geöffnet werden kann, und ihn ggf. öffnet.

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

Einrichtung zusätzlicher Plattformen

Kein zusätzliches Setup.

Dateien

Mithilfe dieser Features kann eine App andere Apps zum Öffnen und Anzeigen einer Datei anfordern. Xamarin.Essentials erkennt automatisch den Dateityp (MIME) und fordert an, dass die Datei geöffnet wird.

Hier sehen Sie ein Beispiel, wie Text auf einen Datenträger geschrieben und angefordert wird, diesen zu öffnen:

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

Präsentationsspeicherort beim Öffnen von Dateien

Wenn Sie unter iPadOS eine Freigabe oder ein Anfangsstartprogramm anfordern, haben Sie die Möglichkeit, die Präsentation in einem Popover-Steuerelement 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 Ort 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 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
});

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

Wenn Sie Xamarin.Forms verwenden, können Sie eine View übergeben und die Begrenzungen berechnen:

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

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

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

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

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

Plattformunterschiede

Die von CanOpenAsync zurückgegebene Aufgabe wird sofort abgeschlossen.

API

Auf Channel 9 und auf YouTube finden Sie weitere Videos zu Xamarin.