Xamarin.Essentials:Lanceur

La classe Lanceur permet à une application d’ouvrir un URI par le système. Elle est souvent utilisée en cas de lien profond avec les schémas d’URI personnalisés d’une autre application. Si vous souhaitez ouvrir le navigateur sur un site web, reportez-vous à l’API Navigateur.

Bien démarrer

Pour commencer à utiliser cette API, lisez le guide de prise en main pour Xamarin.Essentials vous assurer que la bibliothèque est correctement installée et configurée dans vos projets.

Utilisation de Lanceur

Ajoutez une référence à Xamarin.Essentials dans votre classe :

using Xamarin.Essentials;

Pour utiliser la fonctionnalité Lanceur, appelez la méthode OpenAsync et passez un string ou Uri pour l’ouvrir. Si vous le souhaitez, vous pouvez aussi utiliser la méthode CanOpenAsync pour vérifier si le schéma d’URI peut être géré par une application sur l’appareil.

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

Cette méthode peut être combinée en un seul appel à TryOpenAsync, qui vérifie si le paramètre peut être ouvert et, le cas échéant, l’ouvre.

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

Configuration de la plateforme supplémentaire

Aucune configuration supplémentaire.

Fichiers

Cette fonctionnalité permet à une application de demander à d’autres applications d’ouvrir et d’afficher un fichier. Xamarin.Essentials détecte automatiquement le type de fichier (MIME) et demande l’ouverture du fichier.

Voici un exemple d’écriture de texte sur le disque et de demande d’ouverture :

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

Emplacement de présentation lors de l’ouverture de fichiers

Lors de la demande d’un partage ou de l’ouverture d’un lanceur sur iPadOS, vous avez la possibilité de présenter dans un contrôle contextuel. Cela spécifie l’emplacement où le menu contextuel s’affiche et pointe une flèche directement vers. Cet emplacement est souvent le contrôle qui a lancé l’action. Vous pouvez spécifier l’emplacement à l’aide de la PresentationSourceBounds propriété :

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

Tout ce qui est décrit ici fonctionne également pour Share et Launcher.

Si vous utilisez, Xamarin.Forms vous pouvez passer un View et calculer les 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);
}

Vous pouvez ensuite l’utiliser lors de l’appel de 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
    }
}

Vous pouvez transmettre l’élément appelant lorsque le Command est déclenché :

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

Différences entre les plateformes

La tâche retournée à partir de CanOpenAsync se termine immédiatement.

API

Retrouvez d’autres vidéos Xamarin sur Channel 9 et YouTube.