ストアで公開されたアプリをコードから更新するUpdate Store-published apps from your code

Windows 10 バージョン 1607 (ビルド 14393) 以降、Windows 10 では、開発者はストアからのアプリの更新に関してより強力な保証を行うことができます。Starting in Windows 10, version 1607 (build 14393), Windows 10 allows developers to make stronger guarantees around app updates from the Store. これを行うには、いくつかの単純な Api が必要です。これにより、一貫性のある予測可能なユーザーエクスペリエンスが作成され、開発者は、Windows で大量の処理を実行できるようにしながら、最適な操作に専念できます。Doing this requires a few simple APIs, creates a consistent and predictable user experience and lets developers to focus on what they do best while allowing Windows to do the heavy lifting.

アプリの更新プログラムを管理するには、2つの基本的な方法があります。There are two fundamental ways that app updates can be managed. どちらの場合も、これらのメソッドの最終的な結果は同じです。更新が適用されます。In both cases, the net result for these methods is the same - the update is applied. ただし、1つのケースでは、他のケースでは、ユーザーエクスペリエンスをより詳細に制御できるようにするために、システムがすべての作業を実行するように選択できます。However, in one case, you can choose to let the system do all the work while in the other case you might want to have a deeper level of control over the user experience.

単純な更新Simple updates

まず、非常に単純な API 呼び出しを使用して、更新プログラムを確認し、ダウンロードしてから、ユーザーがインストールするアクセス許可を要求するようにシステムに指示します。First and foremost is the very simple API call that tells the system to check for updates, download them and then request permission from the user to install them. まず、 Storecontextクラスを使用してstorepackageupdateオブジェクトを取得し、ダウンロードしてインストールします。You'll start by using the StoreContext class to get StorePackageUpdate objects, download and install them.

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つあります。今すぐ更新を適用するか、更新を延期します。At this point the user has two options they can choose from: apply the update now or defer the update. ユーザーがどのような選択を行うかは、StorePackageUpdateResult オブジェクトを介してに返されます。これにより、開発者は、続行するために更新が必要な場合や、後でもう一度試す必要がある場合に、アプリを閉じるなどの操作を行うことができます。Whatever choice the user makes will be returned back to via the StorePackageUpdateResult object allowing developers to take further actions such as closing down the app if the update is required to continue or simply trying again later.

更新プログラムの微調整Fine-controlled updates

完全にカスタマイズされたエクスペリエンスを必要とする開発者に対しては、追加の Api が提供されるため、更新プロセスをより細かく制御できます。For developers who want to have a completely customized experience, additional APIs are provided which enable more control over the update process. このプラットフォームでは、次の操作を行うことができます。The platform enables you to do the following:

  • 個々のパッケージのダウンロードまたは更新全体で進行状況イベントを取得します。Get progress events on an individual package download or on the whole update.
  • 更新プログラムは、1つではなく、ユーザーとアプリの利便性で適用します。Apply updates at the user's and app's convenience rather than one or the other.

開発者は、(アプリの使用中に) バックグラウンドで更新プログラムをダウンロードし、ユーザーに更新プログラムのインストールを要求することができます。同意しない場合は、更新プログラムによって影響を受ける機能を、選択した場合にのみ無効にできます。Developers are able to download updates in the background (while app is in use) then request the user install updates, if they decline, you can simply disable capabilities affected by the update if you choose.

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

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

更新プログラムをインストールします。Install updates

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
}

更新を必須にするMaking updates mandatory

場合によっては、ユーザーのデバイスにインストールする必要がある更新プログラムを用意することが望ましい場合があります。これは、本当に必須です (待機できないアプリに対する重要な修正など)。In some cases, it might actually be desirable to have an update that must be installed to a user's device - making it truly mandatory (e.g. a critical fix to an app that can't wait). このような場合は、更新を必須にするために実行できる追加のメジャーがあります。In these cases, there are additional measures that you can take to make the update mandatory.

  1. 必須の更新ロジックをアプリコードに実装します (必須の更新プログラム自体の前に実行する必要があります)。Implement the mandatory update logic in your app code (would need to be done before mandatory update itself).
  2. デベロッパーセンターへの送信中に、[この更新を必須にする] チェックボックスがオンになっていることを確認します。During submission to the Dev Center, ensure the Make this update mandatory box is selected.

アプリコードの実装Implementing app code

必須の更新プログラムを最大限に活用するには、上記のコードに若干の変更を加える必要があります。In order to take full advantage of mandatory updates, you'll need to make some slight modifications to the code above. 更新が必須かどうかを判断するには、 Storepackageupdate オブジェクトを使用する必要があります。You'll need to use the StorePackageUpdate object to determine if the update is mandatory.

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

次に、必須の更新プログラムがあること、およびアプリを完全に使用するためにインストールする必要があることをユーザーに通知するカスタムアプリダイアログを作成する必要があります。Then you'll need to create a custom in app dialog to inform the user that there is a mandatory update and that they must install it to continue full use of the app. ユーザーが更新を拒否した場合、アプリは機能を低下させるか (たとえば、オンラインアクセスを禁止)、完全に終了する (たとえば、オンラインのみのゲーム) ことができます。If the user declines the update, the app could either degrade functionality (for example, prevent online access) or terminate completely (for example, online-only games).

Partner CenterPartner Center

Storepackageupdateが必須の更新に対して true と表示されるようにするには、 [パッケージ] ページのパートナーセンターで更新を必須としてマークする必要があります。To ensure the StorePackageUpdate shows true for a mandatory update, you will need to mark the update as mandatory in the Partner Center in the Packages page.

注意すべき点がいくつかあります。A couple of things to note:

  • 必須の更新プログラムが別の必須ではない更新プログラムに置き換えられた後にデバイスがオンラインに戻った場合、必須でない更新プログラムが必要になる前に、その更新プログラムは必須としてデバイスに表示されます。If a device comes back online after a mandatory update has been superseded with another non-mandatory update, the non-mandatory update will still show up on the device as mandatory given the missed update before it was mandatory.
  • 現在、開発者が管理する更新プログラムと必須の更新プログラムはストアに限定されています。Developer-controlled updates and mandatory updates are currently limited to the Store.