Launcher
In diesem Artikel wird beschrieben, wie Sie die .NET Multi-platform App UI (.NET MAUI) ILauncher-Schnittstelle verwenden können. Diese Schnittstelle ermöglicht es einer Anwendung, einen URI vom System zu öffnen. Diese Methode zum Öffnen einer Anwendung wird häufig verwendet, wenn Deep-Verknüpfungen mit den benutzerdefinierten URI-Schemas einer anderen Anwendung erstellt werden.
Die Standardimplementierung der ILauncher
-Schnittstelle ist über die Launcher.Default-Eigenschaft verfügbar. Sowohl die ILauncher
-Schnittstelle als auch Launcher
Klasse sind im Microsoft.Maui.ApplicationModel
Namespace enthalten.
Wichtig
Um den Browser auf einer Website zu öffnen, verwenden Sie stattdessen die Browser--API.
Loslegen
Für den Zugriff auf die Startprogrammfunktionalität ist das folgende plattformspezifische Setup erforderlich.
Wenn Sie Deep-Links verwenden möchten, um andere Android-Apps zu öffnen, sollten Sie einen Absichtsfilter in Ihrer App definieren. Dies kann durch Hinzufügen des folgenden XML zur Datei Platforms/Android/AndroidManifest.xml erreicht werden:
<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>
Die <data>
-Elemente sind die URI-Schemas, die bei Ihrer App vorinstalliert sind. Sie können keine Schemas verwenden, die nicht im Absichtsfilter definiert sind.
Damit Ihre App von anderen Apps durchsuchbar ist, deklarieren Sie ein <data>
-Element mit dem Attribut android:scheme
.
<data android:scheme="appName"/>
Öffnen einer anderen App
Rufen Sie zum Verwenden der Startprogrammfunktion die ILauncher.OpenAsync-Methode auf, und übergeben Sie eine String oder Uri, die die zu öffnende App darstellt. Optional kann die ILauncher.CanOpenAsync(Uri)-Methode verwendet werden, um zu überprüfen, ob das URI-Schema von einer App auf dem Gerät behandelt werden kann. Der folgende Code veranschaulicht, wie Sie überprüfen, ob ein URI-Schema unterstützt wird oder nicht, und öffnet dann den URI:
bool supportsUri = await Launcher.Default.CanOpenAsync("lyft://");
if (supportsUri)
await Launcher.Default.OpenAsync("lyft://ridetype?id=lyft_line");
Das vorherige Codebeispiel kann mithilfe der TryOpenAsync(Uri)vereinfacht werden, wodurch überprüft wird, ob das URI-Schema geöffnet werden kann, bevor es geöffnet wird:
bool launcherOpened = await Launcher.Default.TryOpenAsync("lyft://ridetype?id=lyft_line");
if (launcherOpened)
{
// Do something fun
}
Öffnen einer anderen App über eine Datei
Das Startprogramm kann auch verwendet werden, um eine App mit einer ausgewählten Datei zu öffnen. .NET MAUI erkennt automatisch den Dateityp (MIME) und öffnet die Standard-App für diesen Dateityp. Wenn mehrere Apps beim Dateityp registriert sind, wird dem Benutzer ein App-Auswahl-Popover angezeigt.
Im folgenden Codebeispiel wird Text in eine Datei geschrieben und die Textdatei mit dem Startfeld geöffnet:
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)));
Steuern von Dateispeicherorten
Wichtig
Dieser Abschnitt gilt nur für Android.
In einigen Szenarien unter Android, z. B. wenn sich eine Datei im privaten Speicher befindet, kann sie in den App-Cache kopiert werden, der dann über eine Android-FileProvider
freigegeben wird. Dies kann jedoch unbeabsichtigt den gesamten Cache- und App-Daten für einen Angreifer verfügbar machen. Dies kann verhindert werden, indem Sie eine Datei zum Überschreiben der Dateianbieter-Pfade zu Ihrer App hinzufügen und sicherstellen, dass die Dateien vor der Freigabe an den in dieser Datei angegebenen Speicherort kopiert werden.
Um Ihrem App eine Überschreibdatei für Dateipfade von Dateianbietern hinzuzufügen, legen Sie eine Datei namens microsoft_maui_essentials_fileprovider_file_paths.xml im Ordner Platforms\Android\Resources\xml Ihrer App ab. Daher sollte der vollständige relative Dateiname für das Projekt Platforms\Android\Resources\xml\microsoft_maui_essentials_fileprovider_file_paths.xmlsein. Fügen Sie dann der Datei XML für die erforderlichen Pfade hinzu:
<?xml version="1.0" encoding="UTF-8" ?>
<paths>
<external-path name="external_files" path="sharing-root" />
<cache-path name="internal_cache" path="sharing-root" />
<external-cache-path name="external_cache" path="sharing-root" />
</paths>
Weitere Informationen zu Dateianbieterpfaden finden Sie auf FileProvider auf developer.android.com.
Bevor Sie eine Datei freigeben, sollten Sie sicherstellen, dass sie zuerst in den Freigabestammordner Ordners in einem der Speicherorte aus der Außerkraftsetzungsdatei geschrieben wird:
// Write into the specific sub-directory
var dir = Path.Combine(FileSystem.CacheDirectory, "sharing-root");
Directory.CreateDirectory(dir);
var file = Path.Combine(dir, "mydata.txt");
await File.WriteAllTextAsync(file, $"My data: {count}");
// Share the file
await Launcher.OpenAsync(new OpenFileRequest
{
Title = "My data",
File = new ReadOnlyFile(file),
});
Sie können überprüfen, ob die Datei ordnungsgemäß freigegeben wird, wenn der freigegebene URI das Freigabestammverzeichnis ausschließt. Wenn Sie beispielsweise die Datei <CacheDirectory>/sharing-root/mydata.txt freigeben und der freigegebene URI content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/sharing-root/mydata.txt
ist, verwendet der Dateianbieter nicht den richtigen Pfad. Wenn der freigegebene URI content://com.companyname.overwritefileproviderpaths.fileProvider/internal_cache/mydata.txt
ist, verwendet der Dateianbieter den richtigen Pfad.
Warnung
Wenn Sie eine Datei freigeben und eine Java.Lang.IllegalArgumentException
-Nachricht mit einem Hinweis wie "Fehler beim Auffinden des konfigurierten Stamms, der /data/data/com.companyname.overwritefileproviderpaths/cache/some-non-sharing-path/mydata.txt" enthält, erhalten, teilen Sie wahrscheinlich eine Datei außerhalb des Freigabestamms.
Startprogramm-Position festlegen
Wichtig
Dieser Abschnitt gilt nur für iPadOS.
Wenn Sie auf iPadOS einen Teilen- oder Öffnen-Launcher öffnen, können Sie ihn in einem Popover darstellen. Dadurch wird angegeben, wo der Popover angezeigt wird, und zeigt einen Pfeil direkt an. Dieser Ort ist häufig die Steuerung, die die Aktion gestartet hat. Sie können den Speicherort mithilfe der eigenschaft PresentationSourceBounds angeben:
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
});
Alles, was hier beschrieben wird, funktioniert gleichermaßen für Share und Launcher.
Hier ist eine Erweiterungsmethode, mit der die Grenzen einer Ansicht berechnet werden:
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);
}
}
Dies kann dann beim Aufrufen von RequestAsyncverwendet werden:
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
}
}
Sie können das aufrufende Element übergeben, wenn die Command
ausgelöst wird:
<Button Text="Share"
Command="{Binding ShareWithFriendsCommand}"
CommandParameter="{Binding Source={RelativeSource Self}}"/>
Ein Beispiel für die ViewHelpers
-Klasse finden Sie im .NET MAUI-Beispiel, das auf GitHub-gehostet wird.
Plattformunterschiede
In diesem Abschnitt werden die plattformspezifischen Unterschiede mit der Startprogramm-API beschrieben.
Die von CanOpenAsync zurückgegebene Task wird sofort abgeschlossen.