Launcher
本文說明如何使用 .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 方法,並傳入 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 配置之前,先檢查 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
範例,請參閱 裝載在 GitHub 上的 .NET MAUI 範例。
平台差異
本節說明啟動器 API 的平臺特定差異。
Task從 CanOpenAsync 傳回的 會立即完成。