如何获取UWP应用更新的可选/强制状态与版本?附测试方法
UWP应用更新:获取强制/可选状态及版本信息的可行方案
问题回顾
使用StoreContext.GetAppAndOptionalStorePackageUpdatesAsync()仅能检测是否存在更新,无法获取更新包的强制/可选状态和目标版本信息,导致无法实现“允许用户跳过可选更新”的UI逻辑。同时测试飞行包未勾选“设为强制更新”时,自定义的IsMandatoryUpdate()方法仍返回true,无法准确区分更新类型,也无法测试可选更新场景。已尝试Package.Current、Package.Dependencies及该方法返回的包信息,输出内容无差异。
解决方案
1. 从StorePackageUpdate提取版本与强制状态信息
StorePackageUpdate对象的Package属性包含完整的目标包信息,可直接获取版本号,同时Mandatory字段的准确性需要结合Store后台配置与版本号校验:
private async Task CheckForUpdates() { var storeContext = StoreContext.GetDefault(); var updates = await storeContext.GetAppAndOptionalStorePackageUpdatesAsync(); if (updates.Count > 0) { foreach (var update in updates) { // 获取目标版本号 var targetVersion = update.Package.Id.Version; string targetVersionStr = $"{targetVersion.Major}.{targetVersion.Minor}.{targetVersion.Build}.{targetVersion.Revision}"; // 获取强制更新状态 bool isMandatory = update.Mandatory; // 结合当前版本校验,避免元数据同步延迟导致的误判 var currentVersion = Package.Current.Id.Version; bool isVersionHigher = targetVersion.Major > currentVersion.Major || (targetVersion.Major == currentVersion.Major && targetVersion.Minor > currentVersion.Minor) || (targetVersion.Major == currentVersion.Major && targetVersion.Minor == currentVersion.Minor && targetVersion.Build > currentVersion.Build) || (targetVersion.Major == currentVersion.Major && targetVersion.Minor == currentVersion.Minor && targetVersion.Build == currentVersion.Build && targetVersion.Revision > currentVersion.Revision); if (isVersionHigher) { // 处理更新逻辑:强制更新则弹窗提示必须更新,可选更新则提供跳过选项 } } } }
如果返回的Package与当前应用包信息一致,说明Store后台元数据未同步,可等待1-2小时后重试,或检查Store后台的更新发布状态。
2. 修复强制更新判断异常
测试飞行包的Mandatory字段返回异常,需排查以下几点:
- 确认Store后台飞行包设置中未勾选“设为强制更新”,且该飞行包版本号高于测试设备当前安装的版本
- 重置测试设备的Microsoft Store缓存:设置 → 应用 → Microsoft Store → 高级选项 → 重置
- 确保测试设备的登录账号已加入对应的飞行测试组,且切换到正确的测试通道(如“预览”通道)
3. 替代方案:Store REST API
若UWP内置API仍无法满足需求,可通过Store官方REST API获取更详细的更新元数据:
- 使用应用的Store ID和用户身份令牌调用更新查询接口,可获取包括强制状态、版本号、更新说明在内的完整信息
- 注意:需处理用户身份验证流程,仅适用于已发布到Microsoft Store的应用
可选更新测试方法
- 在Store后台创建飞行测试包,不勾选“设为强制更新”,且版本号高于测试设备当前安装的应用版本
- 将测试设备的登录账号加入该飞行测试组,并切换到对应的测试通道
- 重置Store缓存后,手动触发应用内的更新检查,此时
update.Mandatory应返回false,即可测试可选更新的UI逻辑(如提供“稍后更新”按钮)
内容的提问来源于stack exchange,提问作者mateen
相关产品推荐
相关产品推荐

