Sdílet prostřednictvím


Launcher

Browse sample. Procházení ukázky

Tento článek popisuje, jak můžete použít rozhraní .NET Multi-Platform App UI (.NET MAUI). ILauncher Toto rozhraní umožňuje aplikaci otevřít identifikátor URI systému. Tento způsob otevření aplikace se často používá při hlubokém propojení do vlastních schémat identifikátorů URI jiné aplikace.

Výchozí implementace ILauncher rozhraní je k dispozici prostřednictvím Launcher.Default vlastnosti. Rozhraní ILauncher i Launcher třída jsou obsaženy v Microsoft.Maui.ApplicationModel oboru názvů.

Důležité

Pokud chcete prohlížeč otevřít na web, použijte místo toho rozhraní API prohlížeče .

Začínáme

Pro přístup k funkcím spouštěče se vyžaduje následující nastavení specifické pro platformu.

Pokud chcete použít přímé odkazy k otevření jiných aplikací pro Android, měli byste ve své aplikaci definovat filtr záměru. Toho lze dosáhnout přidáním následujícího XML do souboru 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>

Prvky <data> jsou schémata identifikátorů URI, která jsou předregistrovaná ve vaší aplikaci. Schémata, která nejsou definovaná ve filtru záměru, nemůžete použít.

Pokud chcete, aby aplikace byla v jiných aplikacích k dispozici, deklarujte <data> prvek s atributem android:scheme :

<data android:scheme="appName"/>

Otevřít jinou aplikaci

Pokud chcete použít funkci Launcher, zavolejte metodu ILauncher.OpenAsync a předejte String aplikaci nebo Uri představující aplikaci, která se má otevřít. Volitelně můžete použít metodu ILauncher.CanOpenAsync(Uri) ke kontrole, jestli schéma identifikátoru URI může zpracovat aplikace na zařízení. Následující kód ukazuje, jak zkontrolovat, jestli je schéma identifikátoru URI podporované nebo ne, a pak otevře identifikátor URI:

bool supportsUri = await Launcher.Default.CanOpenAsync("lyft://");

if (supportsUri)
    await Launcher.Default.OpenAsync("lyft://ridetype?id=lyft_line");

Předchozí příklad kódu lze zjednodušit pomocí TryOpenAsync(Uri)metody , která před otevřením zkontroluje, jestli je možné otevřít schéma identifikátoru URI:

bool launcherOpened = await Launcher.Default.TryOpenAsync("lyft://ridetype?id=lyft_line");

if (launcherOpened)
{
    // Do something fun
}

Otevření jiné aplikace prostřednictvím souboru

Spouštěč lze také použít k otevření aplikace s vybraným souborem. .NET MAUI automaticky rozpozná typ souboru (MIME) a otevře výchozí aplikaci pro tento typ souboru. Pokud je u typu souboru zaregistrovaných více než jedna aplikace, zobrazí se uživateli automaticky otevírané okno výběru aplikace.

Následující příklad kódu zapíše text do souboru a otevře textový soubor se spouštěčem:

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)));

Nastavení umístění spouštěče

Důležité

Tato část platí jenom pro iPadOS.

Při vyžádání sdílené složky nebo otevření spouštěče v iPaduOS ji můžete prezentovat v automaticky otevírané nabídce. Určuje, kde se automaticky otevírané okno zobrazí, a nasměruje šipku přímo na. Toto umístění je často ovládací prvek, který akci spustil. Umístění můžete zadat pomocí PresentationSourceBounds vlastnosti:

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
    });

Vše popsané zde funguje stejně pro Share a Launcher.

Tady je rozšiřující metoda, která pomáhá vypočítat hranice zobrazení:

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);
    }
}

To se pak dá použít při volání 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
    }
}

Volající prvek můžete předat při aktivaci Command :

<Button Text="Share"
        Command="{Binding ShareWithFriendsCommand}"
        CommandParameter="{Binding Source={RelativeSource Self}}"/>

Příklad ViewHelpers třídy najdete v ukázce .NET MAUI hostované na GitHubu.

Rozdíly mezi platformami

Tato část popisuje rozdíly specifické pro platformu s rozhraním API spouštěče.

Vrácená Task z CanOpenAsync dokončena okamžitě.