Launcher
本文介绍如何使用 .NET Multi-platform App UI (.NET MAUI) ILauncher 接口。 此接口支持应用程序通过系统打开 URI。 在深入链接到另一个应用程序的自定义 URI 方案时,通常使用此方法打开应用程序。
ILauncher
接口的默认实现通过 Launcher.Default 属性提供。 ILauncher
接口和 Launcher
类都包含在 Microsoft.Maui.ApplicationModel
命名空间中。
重要
要打开浏览器并访问网站,需改用浏览器 API。
开始使用
要访问启动器功能,需要以下特定于平台的设置。
要使用深层链接打开其他 Android 应用,则应在应用中定义意向筛选器。 这可以通过将以下 XML 添加到 Platforms/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 方案。 不能使用未在意向筛选器中定义的方案。
要使你的应用可从其他应用浏览,需要声明包含 android:scheme
特性的 <data>
元素:
<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
类的示例,请参阅 GitHub 上托管的 .NET MAUI 示例。
平台差异
本部分介绍启动器 API 的特定于平台的差异。
从 CanOpenAsync 返回的 Task 立即完成。