ストアで公開されたアプリをコードから更新する

Windows 10、バージョン 1607 (ビルド 14393) 以降では、開発者は、Microsoft Store からのアプリの更新に関してより強力な保証を行うことができます。 これを行うには、いくつかのシンプルな API を使用して、一貫性のある予測可能なユーザー エクスペリエンスを作成する必要があります。重労働は Windows に任せて、開発者は最適なユーザー エクスペリエンスの作成に集中できます。

アプリの更新を管理するには、2 つの基本的な方法があります。 どちらのケースも、これらの方法の最終的な結果は同じであり、更新プログラムが適用されます。 ただし、一方のケースでは、システムがすべての作業を実行することを選択できますが、他方のケースでは、ユーザー エクスペリエンスをより詳細に制御できます。

単純な更新

最初の方法は、非常に単純な API 呼び出しを使用して、更新プログラムを確認し、それらをダウンロードしてから、それらをインストールするアクセス許可をユーザーに要求するようにシステムに指示するというものです。 まず、StoreContext クラスを使用して StorePackageUpdate オブジェクトを取得し、それらをダウンロードしてインストールします。

using Windows.Services.Store;

private async void GetEasyUpdates()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation = 
            updateManager.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);
        StorePackageUpdateResult result = await downloadOperation.AsTask();
    }
}

この時点で、ユーザーが選択できるオプションは 2 つあります。今すぐ更新プログラムを適用するか、更新を延期することです。 ユーザーが選択した内容は、StorePackageUpdateResult オブジェクトを介して返されます。これにより、開発者は、続行するために更新が必要な場合、または単に後で再試行する場合に、アプリを終了するなどのアクションを実行することができます。

更新の微調整

完全にカスタマイズされたエクスペリエンスを必要とする開発者に対しては、更新プロセスをより細かく制御できる、追加の API が用意されています。 このプラットフォームでは、次の操作を行うことができます。

  • 個々のパッケージのダウンロードまたは更新全体について進行状況イベントを取得します。
  • 更新プログラムを、ユーザーとアプリのどちらか一方ではなく、双方の都合が良い時に適用します。

開発者は、(アプリの使用中に) バックグラウンドで更新プログラムをダウンロードした後、ユーザーに更新プログラムのインストールを要求することができます。ユーザーが同意しない場合は、その更新プログラムの影響を受ける機能を単に無効にする (そのように選択した場合) ことができます。

更新プログラムのダウンロード

private async void DownloadUpdatesAsync()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> downloadOperation =
            updateManager.RequestDownloadStorePackageUpdatesAsync(updates);

        downloadOperation.Progress = async (asyncInfo, progress) =>
        {
            // Show progress UI
        };

        StorePackageUpdateResult result = await downloadOperation.AsTask();
        if (result.OverallState == StorePackageUpdateState.Completed)
        {
            // Update was downloaded, add logic to request install
        }
    }
}

の更新プログラムをインストールする

private async void InstallUpdatesAsync()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();    

    // Save app state here

    IAsyncOperationWithProgress<StorePackageUpdateResult, StorePackageUpdateStatus> installOperation =
        updateManager.RequestDownloadAndInstallStorePackageUpdatesAsync(updates);

    StorePackageUpdateResult result = await installOperation.AsTask();

    // Under normal circumstances, app will terminate here

    // Handle error cases here using StorePackageUpdateResult from above
}

更新プログラムを必須にする

場合によっては、ユーザーのデバイスに必ずインストールしなければならない更新プログラムを用意して、それを本当に必須にするのが実際に望ましいことがあります (アプリに対する待機できない重要な修正など)。 このような場合は、更新プログラムを必須にするために実行できる追加の手段があります。

  1. 必須の更新ロジックをアプリ コード内に実装します (必須の更新プログラムそのものの前に実行する必要があります)。
  2. デベロッパー センターに送信するときに、[この更新を必須にする] チェックボックスがオンになっていることを確認します。

アプリ コードの実装

必須の更新を最大限に活用するには、上記のコードに若干の変更を加える必要があります。 更新が必須かどうかを判別するために、StorePackageUpdate オブジェクトを使用する必要があります。

 private async bool CheckForMandatoryUpdates()
{
    StoreContext updateManager = StoreContext.GetDefault();
    IReadOnlyList<StorePackageUpdate> updates = await updateManager.GetAppAndOptionalStorePackageUpdatesAsync();

    if (updates.Count > 0)
    {
        foreach (StorePackageUpdate u in updates)
        {
            if (u.Mandatory)
                return true;
        }
    }
    return false;
}

次に、必須の更新プログラムがあること、およびアプリを引き続き完全に使用するにはそれをインストールする必要があることをユーザーに通知する、カスタムのアプリ内ダイアログを作成する必要があります。 ユーザーが更新を拒否した場合は、アプリの機能を低下させる (たとえば、オンライン アクセスを禁止する) か、完全に終了する (たとえば、オンラインのみのゲームの場合) ことができます。

パートナー センター

必須の更新プログラムについて StorePackageUpdate が true を示すようにするには、パートナー センターの [パッケージ] ページでその更新プログラムを必須としてマークする必要があります。

注意するべき点がいくつかあります。

  • 必須の更新プログラムが別の必須ではない更新プログラムで置き換えられた後にデバイスがオンラインに戻った場合、その必須ではない更新プログラムが必須になる前に更新が行われなかったときは、その必須ではない更新プログラムが引き続き必須としてデバイスに表示されます。
  • 現在、開発者が管理する更新プログラムと必須の更新プログラムは Microsoft Store に限定されています。