从代码更新 Store 发布的应用

从 Windows 10 开始,版本 1607 (版本 14393) ,Windows 10 允许开发人员更好地保证应用商店中的应用更新。 这样做需要几个简单的 api,创建一致且可预测的用户体验,并使开发人员能够专注于他们最能实现的功能,同时允许 Windows 执行繁重的工作。

可以通过两种基本方式管理应用更新。 在这两种情况下,这些方法的最终结果相同-应用更新。 但是,在一种情况下,您可以选择让系统完成所有工作,而在另一种情况下,您可能希望更深入地控制用户体验。

简单更新

首先,最重要的是非常简单的 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();
    }
}

此时,用户有两个选项可供选择:立即应用更新或推迟更新。 用户所做的任何选择都将通过 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,则需要在 " " 页面的 "合作伙伴中心" 中将更新标记为必需。

请注意以下几点:

  • 如果在强制的更新与另一个非强制更新取代后设备恢复联机状态,则在该设备强制执行之前,非必需的更新仍会在设备上显示为必需的。
  • 开发人员控制的更新和强制更新当前仅限于应用商店。