次の方法で共有


Launcher

Browse sample. サンプルを参照する

この記事では、.NET マルチプラットフォーム アプリ UI (.NET MAUI) ILauncher インターフェイスを使用する方法について説明します。 このインターフェイスは、アプリケーションがシステムで URI を開くことができるようにします。 このアプリケーションを開く方法は、通常、他のアプリケーションのカスタム URI スキームへのディープ リンクを行う場合に使用されます。

ILauncher インターフェイスの既定の実装は、Launcher.Default プロパティを通じて利用できます。 ILauncher インターフェイスと Launcher クラスは、どちらも Microsoft.Maui.ApplicationModel 名前空間に含まれています。

重要

ブラウザーを Web サイトに開くには、代わりに Browser 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");

前のコード例は、URI スキームを開く前に開くことができるかどうかを確認する TryOpenAsync(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 はすぐに完了します。