从代码更新 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,需要在“包”页的合作伙伴中心将更新标记为强制。

请注意以下几点:

  • 如果设备在强制更新被另一个非强制更新取代后重新上线,则非强制更新仍将在设备上显示为强制更新,因为在强制更新之前错过了更新。
  • 开发人员控制的更新和强制更新目前仅限于应用商店。