次の方法で共有


アプリ拡張機能の作成とホスト

この記事では、Windows 10 アプリの拡張機能を作成し、アプリ内でホストする方法について説明します。 アプリの拡張機能は、UWP アプリとパッケージ デスクトップ アプリでサポートされています。

この記事では、アプリ拡張機能を作成する方法を示すために、Math Extension コード サンプルのパッケージ マニフェスト XML とコード スニペットを使用します。 このサンプルは UWP アプリですが、このサンプルに示されている機能は、パッケージ デスクトップ アプリにも適用できます。 このサンプルの使用を開始するには、次の手順に従います。

  • Math Extension コード サンプルをダウンロードして解凍します。
  • Visual Studio 2019 で、MathExtensionSample.sln を開きます。 ビルドの種類を x86 (Build>Configuration Manager に設定し、両方のプロジェクトで Platformx86 に変更します。
  • ソリューションのデプロイ: Build>ソリューションのデプロイ

アプリ拡張機能の概要

Windows 10 では、アプリの拡張機能によって他のプラットフォームでプラグイン、アドイン、アドオンが提供している機能と類似した機能が提供されます。 アプリの拡張機能は、Windows 10 Anniversary Edition (バージョン 1607、ビルド 10.0.14393) で導入されました。

アプリ拡張機能は、コンテンツと展開イベントをホスト アプリと共有するための拡張宣言を持つ UWP アプリ、またはパッケージ化されたデスクトップ アプリです。 拡張機能アプリでは、複数の拡張機能を提供できます。

アプリ拡張機能も UWP アプリまたはパッケージ化されたデスクトップ アプリであるため、別のアプリ パッケージを作成することなく、完全に機能するアプリとして使用でき、拡張機能をホストすることも、他のアプリに拡張機能を提供することもできます。

アプリ拡張機能ホストを作成すると、アプリのエコシステムを開発する機会が生まれます。このエコシステムでは、他の開発者が、想定していなかったか、リソースを持っていない可能性のある方法でアプリを強化できます。 Microsoft Office 拡張機能、Visual Studio 拡張機能、ブラウザー拡張機能などを検討してください。これにより、付属の機能を超える豊富なエクスペリエンスがアプリに提供されます。 拡張機能は、アプリに価値と寿命を追加できます。

大まかに言うと、アプリ拡張機能の関係を設定するには、次の手順を実行する必要があります。

  1. アプリを拡張機能ホストとして宣言します。
  2. アプリを拡張機能として宣言します。
  3. 拡張機能をアプリ サービス、バックグラウンド タスク、またはその他の方法で実装するかどうかを決定します。
  4. ホストとその拡張機能の通信方法を定義します。
  5. ホスト アプリで Windows.ApplicationModel.AppExtensions API を使用して拡張機能にアクセスします。

拡張機能を使用して新しい関数を追加できる架空の電卓を実装する Math Extension コード サンプル を調べることで、これがどのように行われるかを見てみましょう。 Microsoft Visual Studio 2019 で、コード サンプルから MathExtensionSample.sln を読み込みます。

数値演算拡張機能のコード サンプル

アプリを拡張機能ホストとして宣言する

アプリは、Package.appxmanifest ファイルで <AppExtensionHost> 要素を宣言することによって、自身をアプリ拡張機能ホストとして識別します。 この方法については、MathExtensionHost プロジェクトの Package.appxmanifest ファイルを参照してください。

MathExtensionHost プロジェクトの Package.appxmanifest

<Package
  ...
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">
  ...
    <Applications>
      <Application Id="App" ... >
        ...
        <Extensions>
            <uap3:Extension Category="windows.appExtensionHost">
                <uap3:AppExtensionHost>
                  <uap3:Name>com.microsoft.mathext</uap3:Name>
                </uap3:AppExtensionHost>
          </uap3:Extension>
        </Extensions>
      </Application>
    </Applications>
    ...
</Package>

xmlns:uap3="http://..."と、IgnorableNamespacesuap3が存在していることに注意してください。 uap3 名前空間を使用しているため、これらは必要です。

<uap3:Extension Category="windows.appExtensionHost"> により、このアプリが拡張機能のホストとして識別されます。

<uap3:AppExtensionHost>Name 要素は、extension コントラクト名です。 拡張機能で同じ拡張コントラクト名が指定されると、ホストでそれを見つけることができます。 慣例により、他の拡張コントラクト名との競合の可能性を回避するために、アプリまたは発行元の名前を使用して拡張コントラクト名を構築することをお勧めします。

同じアプリで複数のホストと複数の拡張機能を定義できます。 この例では、1 つのホストを宣言します。 拡張機能は別のアプリで定義されています。

アプリを拡張機能として宣言する

アプリは、Package.appxmanifest ファイルで<uap3:AppExtension>要素を宣言することで、自身をアプリ拡張機能として識別します。 MathExtension プロジェクトで Package.appxmanifest ファイルを開き、その方法を確認します。

MathExtension プロジェクト内の Package.appxmanifest

<Package
  ...
  xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
  IgnorableNamespaces="uap uap3 mp">
  ...
    <Applications>
      <Application Id="App" ... >
        ...
        <Extensions>
          ...
          <uap3:Extension Category="windows.appExtension">
            <uap3:AppExtension Name="com.microsoft.mathext"
                               Id="power"
                               DisplayName="x^y"
                               Description="Exponent"
                               PublicFolder="Public">
              <uap3:Properties>
                <Service>com.microsoft.powservice</Service>
              </uap3:Properties>
              </uap3:AppExtension>
          </uap3:Extension>
        </Extensions>
      </Application>
    </Applications>
    ...
</Package>

ここでも、xmlns:uap3="http://..." 行と、IgnorableNamespacesuap3 が存在していることに注目してください。 これらは、 uap3 名前空間を使用しているために必要です。

<uap3:Extension Category="windows.appExtension"> により、このアプリが拡張機能であると識別されます。

<uap3:AppExtension>属性の意味は次のとおりです。

属性 説明 必須
名前 これは拡張コントラクト名です。 ホストで宣言されている Name と一致すると、そのホストでこの拡張機能を見つけることができます。 ✔️
ID この拡張機能を一意に識別します。 同じ拡張コントラクト名を使用する複数の拡張機能が存在する可能性があるため (いくつかの拡張機能をサポートするペイント アプリを想像してください)、ID を使用して区別することができます。 アプリ拡張機能ホストでは、ID を使用して拡張機能の種類について推測できます。 たとえば、1 つの拡張機能をデスクトップ用に設計し、もう 1 つをモバイル用に設計し、ID を差別化することができます。 Properties 要素を使用することもできます。これについては、以下で説明します。 ✔️
表示名 ホスト アプリから、ユーザーに対して拡張機能を識別するために使用できます。 ローカライズ用の新しいリソース管理システム (ms-resource:TokenName) からクエリを実行でき、これを使用できます。 ローカライズされたコンテンツは、ホスト アプリではなく、アプリ拡張機能パッケージから読み込まれます。
説明 ホスト アプリから、拡張機能をユーザーに説明するために使用できます。 ローカライズ用の新しいリソース管理システム (ms-resource:TokenName) からクエリを実行でき、これを使用できます。 ローカライズされたコンテンツは、ホスト アプリではなく、アプリ拡張機能パッケージから読み込まれます。
PublicFolder パッケージ ルートを基準としたフォルダーの名前。拡張機能ホストとコンテンツを共有できます。 慣例により、名前は "Public" ですが、拡張機能内のフォルダーと一致する任意の名前を使用できます。 ✔️

<uap3:Properties> は、実行時にホストが読み取ることができるカスタム メタデータが含まれた省略可能な要素です。 コード サンプルでは、拡張機能がアプリ サービスとして実装されているため、ホストでは、それを呼び出すことができるように、そのアプリ サービスの名前を取得する方法が必要です。 アプリ サービスの名前は、<Service> 要素で定義されています (任意の名前を定義できます)。 コード サンプルのホストでは、実行時にこのプロパティを検索し、アプリ サービスの名前を学習します。

拡張機能を実装する方法を決定します。

アプリ拡張機能に関する Build 2016 セッションでは、ホストと拡張機能の間で共有されるパブリック フォルダーを使用する方法を示します。 この例では、拡張機能は、ホストが呼び出すパブリック フォルダーに格納されている JavaScript ファイルによって実装されます。 この方法には軽量であるという利点があり、コンパイルは必要ありません。また、拡張機能の手順とホスト アプリの Microsoft Store ページへのリンクを提供する既定のランディング ページの作成をサポートできます。 詳細については、 Build 2016 アプリ拡張機能のコード サンプル を参照してください。 具体的には、InvertImageExtension プロジェクトを参照し、ExtensibilitySample プロジェクトのExtensionManager.csでInvokeLoad()します。

この例では、アプリ サービスを使用して拡張機能を実装します。 アプリ サービスには、次の利点があります。

  • 拡張機能がクラッシュした場合、ホスト アプリは独自のプロセスで実行されるため、ホスト アプリはダウンしません。
  • 選択した言語を使用して、サービスを実装できます。 ホスト アプリの実装に使用される言語と一致する必要はありません。
  • アプリ サービスは独自のアプリ コンテナーにアクセスできます。これは、ホストとは異なる機能を持つ場合があります。
  • サービス内のデータとホスト アプリは分離されています。

アプリ サービス コードをホストする

拡張機能のアプリ サービスを呼び出すホスト コードを次に示します。

MathExtensionHost プロジェクトのExtensionManager.cs

public async Task<double> Invoke(ValueSet message)
{
    if (Loaded)
    {
        try
        {
            // make the app service call
            using (var connection = new AppServiceConnection())
            {
                // service name is defined in appxmanifest properties
                connection.AppServiceName = _serviceName;
                // package Family Name is provided by the extension
                connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;

                // open the app service connection
                AppServiceConnectionStatus status = await connection.OpenAsync();
                if (status != AppServiceConnectionStatus.Success)
                {
                    Debug.WriteLine("Failed App Service Connection");
                }
                else
                {
                    // Call the app service
                    AppServiceResponse response = await connection.SendMessageAsync(message);
                    if (response.Status == AppServiceResponseStatus.Success)
                    {
                        ValueSet answer = response.Message as ValueSet;
                        if (answer.ContainsKey("Result")) // When our app service returns "Result", it means it succeeded
                        {
                            return (double)answer["Result"];
                        }
                    }
                }
            }
        }
        catch (Exception)
        {
             Debug.WriteLine("Calling the App Service failed");
        }
    }
    return double.NaN; // indicates an error from the app service
}

これは、アプリ サービスを呼び出すための一般的なコードです。 アプリ サービスを実装して呼び出す方法の詳細については、「 アプリ サービスを作成して使用する方法を参照してください。

注意すべき点の 1 つは、呼び出すアプリ サービスの名前がどのように決定されるかです。 ホストには拡張機能の実装に関する情報がないため、拡張機能はアプリ サービスの名前を指定する必要があります。 コード サンプルでは、拡張機能によりその <uap3:Properties> 要素のファイル内でアプリ サービスの名前が宣言されています。

MathExtension プロジェクトの Package.appxmanifest

    ...
    <uap3:Extension Category="windows.appExtension">
      <uap3:AppExtension ...>
        <uap3:Properties>
          <Service>com.microsoft.powservice</Service>
        </uap3:Properties>
        </uap3:AppExtension>
    </uap3:Extension>

<uap3:Properties>要素で独自の XML を定義できます。 この場合、拡張機能を呼び出すときにホストがアプリ サービスを使用できるように、アプリ サービスの名前を定義します。

ホストが拡張機能を読み込むとき、次のようなコードは、拡張機能の Package.appxmanifest で定義されているプロパティからサービスの名前を抽出します。

MathExtensionHost プロジェクト内の ExtensionManager.cs に含まれている Update()

...
var properties = await ext.GetExtensionPropertiesAsync() as PropertySet;

...
#region Update Properties
// update app service information
_serviceName = null;
if (_properties != null)
{
   if (_properties.ContainsKey("Service"))
   {
       PropertySet serviceProperty = _properties["Service"] as PropertySet;
       this._serviceName = serviceProperty["#text"].ToString();
   }
}
#endregion

_serviceNameに格納されているアプリ サービスの名前を使用すると、ホストはそれを使用してアプリ サービスを呼び出すことができます。

アプリ サービスを呼び出す場合は、アプリ サービスを含むパッケージのファミリ名も必要です。 この情報は、以下の行で取得され、アプリ拡張機能 API によって提供されます。connection.PackageFamilyName = AppExtension.Package.Id.FamilyName;

ホストと拡張機能の通信方法を定義する

App Services では、 ValueSet を使用して情報を交換します。 ホストの作成者は、柔軟な拡張機能と通信するためのプロトコルを思い付く必要があります。 コード サンプルでは、将来 1 つ、2 つ以上の引数を受け取る可能性がある拡張機能を考慮することを意味します。

この例では、引数のプロトコルは 'Arg' + 引数番号 (たとえば、Arg1Arg2) という名前のキー値ペアが含まれる ValueSet です。 ホストは ValueSet 内のすべての引数を渡し、拡張機能は必要な引数を使用します。 拡張機能が結果を計算できる場合、ホストは拡張機能から返された ValueSet 計算の値を含む Result という名前のキーを持つ必要があります。 そのキーが存在しない場合、ホストは拡張機能が計算を完了できなかったと想定します。

拡張機能のアプリ サービス コード

コード サンプルでは、拡張機能のアプリ サービスはバックグラウンド タスクとして実装されていません。 代わりに、アプリ サービスをホストする拡張機能アプリと同じプロセスで実行されるシングル プロセス アプリ サービス モデルが使用されます。 これは引き続きホスト アプリとは異なるプロセスであり、プロセス分離の利点を提供しながら、拡張機能プロセスとアプリ サービスを実装するバックグラウンド プロセス間のクロスプロセス通信を回避することでパフォーマンス上の利点を得ることができます。 ホスト アプリと同じプロセスで実行するアプリ サービスを変換するバックグラウンド タスクとして実行されるアプリ サービスと同じプロセスで実行されるアプリ サービスの違いを確認する方法を参照してください。

システムは、アプリ サービスがアクティブ化されたときに OnBackgroundActivate() します。 このコードは、実際の App Service 呼び出しを処理するイベント ハンドラー (OnAppServiceRequestReceived()) を設定し、キャンセルイベントやクローズ イベントを処理する遅延オブジェクトの取得などのハウスキーピング イベントを処理します。

MathExtension プロジェクトでApp.xaml.csします。

protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args)
{
    base.OnBackgroundActivated(args);

    if ( _appServiceInitialized == false ) // Only need to setup the handlers once
    {
        _appServiceInitialized = true;

        IBackgroundTaskInstance taskInstance = args.TaskInstance;
        taskInstance.Canceled += OnAppServicesCanceled;

        AppServiceTriggerDetails appService = taskInstance.TriggerDetails as AppServiceTriggerDetails;
        _appServiceDeferral = taskInstance.GetDeferral();
        _appServiceConnection = appService.AppServiceConnection;
        _appServiceConnection.RequestReceived += OnAppServiceRequestReceived;
        _appServiceConnection.ServiceClosed += AppServiceConnection_ServiceClosed;
    }
}

拡張機能の動作を行うコードは、 OnAppServiceRequestReceived()内にあります。 この関数は、計算を実行するためにアプリ サービスが呼び出されたときに呼び出されます。 ValueSet から必要な値が抽出されます。 計算が可能な場合は、ホストに返される ValueSet Result という名前のキーの下に結果が格納されます。 このホストとその拡張機能の通信方法に定義されているプロトコルに従って、 Result キーが存在すると成功を示し、それ以外の場合は失敗することを思い出してください。

MathExtension プロジェクトでApp.xaml.csします。

private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
    // Get a deferral because we use an awaitable API below (SendResponseAsync()) to respond to the message
    // and we don't want this call to get cancelled while we are waiting.
    AppServiceDeferral messageDeferral = args.GetDeferral();
    ValueSet message = args.Request.Message;
    ValueSet returnMessage = new ValueSet();

    double? arg1 = Convert.ToDouble(message["arg1"]);
    double? arg2 = Convert.ToDouble(message["arg2"]);
    if (arg1.HasValue && arg2.HasValue)
    {
        returnMessage.Add("Result", Math.Pow(arg1.Value, arg2.Value)); // For this sample, the presence of a "Result" key will mean the call succeeded
    }

    await args.Request.SendResponseAsync(returnMessage);
    messageDeferral.Complete();
}

拡張機能を管理する

ここまで、ホストと拡張機能の間の関係を実装する方法を見てきました。次に、システムにインストールされている拡張機能をホストが検出し、拡張機能を含むパッケージの追加と削除に対応する方法を見てみましょう。

Microsoft Store は、拡張機能をパッケージとして提供します。 AppExtensionCatalogは、ホストの拡張機能コントラクト名に一致する拡張機能を含むインストール済みパッケージを検索し、ホストに関連するアプリ拡張機能パッケージがインストールまたは削除されたときに発生するイベントを提供します。

コード サンプルでは、ExtensionManager クラス (MathExtensionHost プロジェクトのExtensionManager.csで定義) は、拡張機能を読み込み、拡張機能パッケージのインストールとアンインストールに応答するためのロジックをラップします。

ExtensionManager コンストラクターは、AppExtensionCatalogを使用して、ホストと同じ拡張コントラクト名を持つシステム上のアプリ拡張機能を検索します。

MathExtensionHost プロジェクト内の ExtensionManager.cs。

public ExtensionManager(string extensionContractName)
{
   // catalog & contract
   ExtensionContractName = extensionContractName;
   _catalog = AppExtensionCatalog.Open(ExtensionContractName);
   ...
}

拡張機能パッケージがインストールされると、 ExtensionManager は、ホストと同じ拡張コントラクト名を持つパッケージ内の拡張機能に関する情報を収集します。 インストールは、影響を受ける拡張機能の情報が更新される更新プログラムを表している可能性があります。 拡張機能パッケージがアンインストールされると、 ExtensionManager は、影響を受ける拡張機能に関する情報を削除して、使用できなくなった拡張機能をユーザーが認識できるようにします。

MathExtensionHost プロジェクトのExtensionManager.csで定義されているExtension クラスは、拡張機能の ID、説明、ロゴ、アプリ固有の情報 (ユーザーが拡張機能を有効にしたかどうかなど) にアクセスするためにコード サンプル用に作成されました。

拡張機能が読み込まれていると言うには (ExtensionManager.csLoad()を参照)、パッケージの状態が問題なく、ID、ロゴ、説明、パブリック フォルダーが取得されたことを意味します (このサンプルでは使用しません。取得方法を示すためだけに使用します)。 拡張機能パッケージ自体が読み込まれていません。

アンロードの概念は、ユーザーに表示されなくなった拡張機能を追跡するために使用されます。

ExtensionManagerは、拡張機能、名前、説明、ロゴを UI にバインドできるコレクション Extension インスタンスを提供します。 ExtensionsTab ページはこのコレクションにバインドされ、拡張機能を有効または無効にしたり、拡張機能を削除したりするための UI を提供します。

[拡張機能] タブの UI の例

拡張機能が削除されると、拡張機能を含むパッケージ (および場合によっては他の拡張機能が含まれている可能性があります) をアンインストールすることを確認するようにユーザーに求められます。 ユーザーが同意すると、パッケージがアンインストールされ、 ExtensionManager は、ホスト アプリで使用できる拡張機能の一覧からアンインストールされたパッケージ内の拡張機能を削除します。

アンインストール UI

アプリ拡張機能とホストのデバッグ

多くの場合、拡張機能のホストと拡張機能は同じソリューションの一部ではありません。 その場合は、ホストと拡張機能をデバッグします。

  1. Visual Studio の 1 つのインスタンスにホスト プロジェクトを読み込みます。
  2. Visual Studio の別のインスタンスに拡張機能を読み込みます。
  3. デバッガーでホスト アプリを起動します。
  4. デバッガーで拡張機能アプリを起動します。 (拡張機能をデバッグするのではなくデプロイしてホストのパッケージ インストール イベントをテストする場合は、ソリューション代わりに) >ビルドします。

これで、ホストと拡張機能のブレークポイントにヒットできるようになります。 拡張機能アプリ自体のデバッグを開始すると、アプリの空のウィンドウが表示されます。 空白のウィンドウが表示されないようにするには、拡張機能プロジェクトのデバッグ設定で、開始時にアプリが起動されずにデバッグされるように変更できます (拡張機能プロジェクトを右クリックし、[プロパティ] > [デバッグ] > [起動しないが、開始時にコードをデバッグ] を選択)。この場合も拡張機能プロジェクトのデバッグを開始 (F5) する必要がありますが、開始は、ホストが拡張機能をアクティブ化し、拡張機能内のブレークポイントがヒットした後になります。

コード サンプルをデバッグする

コード サンプルでは、ホストと拡張機能は同じソリューションにあります。 デバッグするには、次の操作を行います。

  1. MathExtensionHostがスタートアップ プロジェクトであることを確認します ([MathExtensionHost プロジェクトを右クリックし、スタートアップ プロジェクトとして設定をクリックします)。
  2. MathExtensionHost プロジェクトのExtensionManager.csのInvokeにブレークポイントを配置します。
  3. F5 を使用して、 MathExtensionHost プロジェクトを実行します。
  4. MathExtension プロジェクトのApp.xaml.csのOnAppServiceRequestReceivedにブレークポイントを配置します。
  5. MathExtension プロジェクトのデバッグを開始します (MathExtension プロジェクトを右クリックし、[デバッグ] > [新しいインスタンスを開始] を選択)。これにより、プロジェクトが展開され、ホスト内のパッケージ インストール イベントがトリガーされます。
  6. MathExtensionHost アプリで、Calculation ページに移動し、x^y をクリックして拡張機能をアクティブにします。 Invoke()ブレークポイントが最初にヒットし、拡張機能の App Service 呼び出しが行われていることを確認できます。 その後、拡張機能の OnAppServiceRequestReceived() メソッドがヒットし、App Service が結果を計算して返すのを確認できます。

アプリ サービスとして実装された拡張機能のトラブルシューティング

拡張機能ホストが拡張機能の App Service への接続に問題がある場合は、 <uap:AppService Name="..."> 属性が、 <Service> 要素に入力したものと一致していることを確認します。 それらが一致しない場合、拡張機能が提供するサービス名は、実装したアプリ サービス名と一致せず、ホストは拡張機能をアクティブ化できません。

MathExtension プロジェクト内の Package.appxmanifest

<Extensions>
   <uap:Extension Category="windows.appService">
     <uap:AppService Name="com.microsoft.sqrtservice" />      <!-- This must match the contents of <Service>...</Service> -->
   </uap:Extension>
   <uap3:Extension Category="windows.appExtension">
     <uap3:AppExtension Name="com.microsoft.mathext" Id="sqrt" DisplayName="Sqrt(x)" Description="Square root" PublicFolder="Public">
       <uap3:Properties>
         <Service>com.microsoft.powservice</Service>   <!-- this must match <uap:AppService Name=...> -->
       </uap3:Properties>
     </uap3:AppExtension>
   </uap3:Extension>
</Extensions>   

テストする基本的なシナリオのチェックリスト

拡張機能ホストを構築し、拡張機能がどの程度適切にサポートされているかをテストする準備ができたら、次の基本的なシナリオを試してみてください。

  • ホストを実行し、拡張機能アプリをデプロイする
    • ホストは、実行中に提供される新しい拡張機能を選択しますか?
  • 拡張機能アプリをデプロイし、ホストをデプロイして実行します。
    • ホストは以前に既存の拡張機能を取得しますか?
  • ホストを実行し、拡張機能アプリを削除します。
    • ホストは削除を正しく検出しますか?
  • ホストを実行し、拡張機能アプリを新しいバージョンに更新します。
    • ホストは変更を受け取り、拡張機能の古いバージョンを正しくアンロードしますか?

テストする高度なシナリオ:

  • ホストを実行し、拡張アプリをリムーバブル メディアに移動し、メディアを削除する
    • ホストはパッケージの状態の変更を検出し、拡張機能を無効にしますか?
  • ホストを実行し、拡張機能アプリを破損させる (無効にする、別の方法で署名するなど)
    • ホストは改ざんされた拡張機能を検出し、正しく処理しますか?
  • ホストを実行し、無効なコンテンツまたはプロパティを持つ拡張機能アプリをデプロイします
    • ホストは無効なコンテンツを検出し、正しく処理しますか?

設計上の考慮事項

  • 使用可能な拡張機能をユーザーに示す UI を提供し、ユーザーが拡張機能を有効または無効にできるようにします。 パッケージがオフラインになったために使用できなくなった拡張機能のグリフを追加することも検討してください。
  • 拡張機能を取得できる場所にユーザーを誘導します。 拡張機能ページでは、アプリで使用できる拡張機能の一覧を表示する Microsoft Store 検索クエリを提供できる場合があります。
  • 拡張機能の追加と削除をユーザーに通知する方法を検討します。 新しい拡張機能がインストールされたときの通知を作成し、有効にするようにユーザーを招待できます。 ユーザーが制御できるように、拡張機能は既定で無効にする必要があります。

アプリ拡張機能とオプション パッケージの違い

オプション パッケージとアプリ拡張機能の主な差別化要因はオープン エコシステムとクローズド エコシステム、依存パッケージと独立パッケージです。

アプリ拡張機能は、オープン エコシステムに参加します。 アプリでアプリ拡張機能をホストできる場合は、拡張機能から情報を受け取る方法に準拠している限り、誰でもホストの拡張機能を記述できます。 これは、アプリで使用できるオプション パッケージを作成できるユーザーをパブリッシャーが決定する、クローズド エコシステムに参加するオプション パッケージとは異なります。

アプリ拡張機能は独立したパッケージであり、スタンドアロン アプリにすることができます。 別のアプリにデプロイの依存関係を持つことはできません。 オプション パッケージにはプライマリ パッケージが必要で、それがないと実行できません。

ゲームの拡張パックは、ゲームに緊密にバインドされ、ゲームとは独立して実行できないので、オプション パッケージの候補として適しています。また、エコシステム内の開発者だけが拡張パックを作成したくない場合があります。

同じゲームにカスタマイズ可能な UI アドオンやテーマがある場合は、拡張機能を提供するアプリが単独で実行でき、サード パーティが実行できるため、アプリ拡張機能が適切な選択肢になる可能性があります。

解説

このトピックでは、アプリ拡張機能の概要について説明します。 注意すべき重要な点は、ホストの作成と Package.appxmanifest ファイルへのマーキング、拡張機能の作成、Package.appxmanifest ファイルへのマーク付け、拡張機能の実装方法 (App Service、バックグラウンド タスクなど) の決定、ホストが拡張機能と通信する方法の定義です。 AppExtensions API を使用して 拡張機能にアクセスして管理します。