从代码更新 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
}
强制更新
在某些情况下,实际上可能需要有一个必须安装到用户设备的更新 - 使其真正成为强制性(例如,对迫不及待的应用进行关键修复)。 在这些情况下,可以采取其他措施来强制更新。
- 在应用代码中实现强制更新逻辑(需要在强制更新本身之前完成)。
- 在提交到开发人员中心期间,确保选中“将此更新设为强制”框。
实施应用代码
为了充分利用强制更新,需要对上面的代码进行一些细微的修改。 需要使用 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,需要在“包”页的合作伙伴中心将更新标记为强制。
请注意以下几点:
- 如果设备在强制更新被另一个非强制更新取代后重新上线,则非强制更新仍将在设备上显示为强制更新,因为在强制更新之前错过了更新。
- 开发人员控制的更新和强制更新目前仅限于应用商店。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈