Поделиться через


Launcher

Browse sample. Обзор примера

В этой статье описывается, как использовать интерфейс многоплатформенного приложения .NET (.NET MAUI). ILauncher Этот интерфейс позволяет приложению открывать универсальный код ресурса (URI) системой. Этот способ открытия приложения часто используется при глубоком связывании с пользовательскими схемами URI другого приложения.

Реализация интерфейса по умолчанию ILauncher доступна через Launcher.Default свойство. Интерфейс ILauncher и Launcher класс содержатся в Microsoft.Maui.ApplicationModel пространстве имен.

Важно!

Чтобы открыть браузер на веб-сайте, используйте ВМЕСТО этого API браузера .

Начать

Для доступа к функциям средства запуска требуется следующая настройка для конкретной платформы.

Если вы хотите использовать глубокие ссылки для открытия других приложений Android, необходимо определить фильтр намерений в приложении. Это можно сделать, добавив следующий XML-файл в файл Platform/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>

Элементы <data> — это предварительно зарегистрированные в приложении схемы URI. Нельзя использовать схемы, которые не определены в фильтре намерений.

Чтобы сделать приложение просматриваемым из других приложений объявлять <data> элемент с атрибутом android:scheme :

<data android:scheme="appName"/>

Открытие другого приложения

Чтобы использовать функцию средства запуска, вызовите метод и передайте ILauncher.OpenAsync или String Uri представляющее приложение для открытия. ILauncher.CanOpenAsync(Uri) При необходимости метод можно использовать для проверка, если схема URI может обрабатываться приложением на устройстве. В следующем коде показано, как проверка, если схема URI поддерживается или нет, а затем открывает URI:

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

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

Предыдущий пример кода можно упростить с помощью проверкаTryOpenAsync(Uri), если можно открыть схему URI, прежде чем открыть ее:

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

if (launcherOpened)
{
    // Do something fun
}

Открытие другого приложения с помощью файла

Средство запуска также можно использовать для открытия приложения с выбранным файлом. .NET MAUI автоматически обнаруживает тип файла (MIME) и открывает приложение по умолчанию для этого типа файла. Если в типе файла зарегистрировано несколько приложений, отображается всплывающее окно выбора приложения пользователю.

В следующем примере кода записывается текст в файл и открывается текстовый файл с помощью средства запуска:

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

Установка расположения средства запуска

Важно!

Этот раздел относится только к iPadOS.

При запросе общего ресурса или открытия средства запуска на iPadOS его можно представить во всплывающем ведении. Это указывает, где появится всплывающее окно и наведите стрелку непосредственно на нее. В этом расположении обычно указывается элемент управления, который инициировал действие. Расположение можно указать с помощью свойства 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
    });

Все описанное здесь также применимо к Share и Launcher.

Ниже приведен метод расширения, который помогает вычислить границы представления:

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

Затем при вызове 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
    }
}

Вы можете передать вызывающий элемент при активации Command:

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

Пример класса см. в примере ViewHelpers .NET MAUI, размещенном на сайте GitHub.

Различия между платформами

В этом разделе описываются различия платформы с API запуска.

Возвращается Task CanOpenAsync немедленно.