Launcher

Browse sample. 流覽範例

本文說明如何使用 .NET 多平臺應用程式 UI (.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 方法,並傳入 StringUri 表示要開啟的應用程式。 或者, 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 配置之前,先檢查 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
    });

這個處所述的一切同樣適用於 ShareLauncher

以下是可協助計算檢視界限的擴充方法:

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 範例,請參閱 裝載在 GitHub 上的 .NET MAUI 範例。

平台差異

本節說明啟動器 API 的平臺特定差異。

TaskCanOpenAsync 傳回的 會立即完成。