Moduł uruchamiania
W tym artykule opisano sposób używania interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI). ILauncher Ten interfejs umożliwia aplikacji otwieranie identyfikatora URI przez system. Ten sposób otwierania aplikacji jest często używany podczas głębokiego łączenia z niestandardowymi schematami identyfikatorów URI innej aplikacji.
Domyślna implementacja interfejsu ILauncher
jest dostępna za pośrednictwem Launcher.Default właściwości . Zarówno interfejs, jak ILauncher
i Launcher
klasa są zawarte w Microsoft.Maui.ApplicationModel
przestrzeni nazw.
Ważne
Aby otworzyć przeglądarkę w witrynie internetowej, zamiast tego użyj interfejsu API przeglądarki .
Rozpocznij
Aby uzyskać dostęp do funkcji uruchamiania, wymagana jest następująca konfiguracja specyficzna dla platformy.
Jeśli chcesz używać linków bezpośrednich do otwierania innych aplikacji systemu Android, należy zdefiniować filtr intencji w aplikacji. Można to osiągnąć, dodając następujący kod XML do pliku 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>
Elementy to schematy identyfikatorów URI wstępnie zarejestrowane w aplikacji. Nie można używać schematów, które nie są zdefiniowane w filtrze intencji.
Aby umożliwić przeglądanie aplikacji z innych aplikacji, zadeklaruj <data>
element za pomocą atrybutu android:scheme
:
<data android:scheme="appName"/>
Otwieranie innej aplikacji
Aby użyć funkcji Uruchamiania, wywołaj metodę ILauncher.OpenAsync i przekaż String element lub Uri reprezentującą aplikację, aby otworzyć. Opcjonalnie można użyć metody w celu sprawdzenia, ILauncher.CanOpenAsync(Uri) czy schemat identyfikatora URI może być obsługiwany przez aplikację na urządzeniu. Poniższy kod pokazuje, jak sprawdzić, czy schemat identyfikatora URI jest obsługiwany, czy nie, a następnie otwiera identyfikator URI:
bool supportsUri = await Launcher.Default.CanOpenAsync("lyft://");
if (supportsUri)
await Launcher.Default.OpenAsync("lyft://ridetype?id=lyft_line");
Poprzedni przykład kodu można uprościć przy użyciu TryOpenAsync(Uri)elementu , który sprawdza, czy schemat identyfikatora URI można otworzyć przed jego otwarciem:
bool launcherOpened = await Launcher.Default.TryOpenAsync("lyft://ridetype?id=lyft_line");
if (launcherOpened)
{
// Do something fun
}
Otwieranie innej aplikacji za pośrednictwem pliku
Uruchamianie może również służyć do otwierania aplikacji z wybranym plikiem. Program .NET MAUI automatycznie wykrywa typ pliku (MIME) i otwiera domyślną aplikację dla tego typu pliku. Jeśli w typie pliku zarejestrowano więcej niż jedną aplikację, zostanie wyświetlone okno podręczne wyboru aplikacji dla użytkownika.
Poniższy przykład kodu zapisuje tekst w pliku i otwiera plik tekstowy za pomocą modułu uruchamiania:
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)));
Ustawianie lokalizacji uruchamiania
Ważne
Ta sekcja dotyczy tylko systemu iPadOS.
Podczas żądania udostępniania lub otwierania modułu uruchamiania w systemie iPadOS można go przedstawić w popover. Określa, gdzie pojawi się wyskakujące okienko i wskaże strzałkę bezpośrednio do. Ta lokalizacja jest często kontrolką uruchamiającą akcję. Lokalizację można określić przy użyciu PresentationSourceBounds właściwości :
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
});
Wszystkie opisane tutaj elementy działają równie dobrze dla Share elementów i Launcher.
Oto metoda rozszerzenia, która pomaga obliczyć granice widoku:
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);
}
}
Następnie można go użyć podczas wywoływania metody 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
}
}
Element wywołujący można przekazać po wyzwoleniu elementu Command
:
<Button Text="Share"
Command="{Binding ShareWithFriendsCommand}"
CommandParameter="{Binding Source={RelativeSource Self}}"/>
Aby zapoznać się z przykładem ViewHelpers
klasy, zobacz przykład .NET MAUI hostowany w witrynie GitHub.
Różnice między platformami
W tej sekcji opisano różnice specyficzne dla platformy dotyczące interfejsu API uruchamiania.
Zwrócony Task z CanOpenAsync zakończenia natychmiast.