我正在开发一个UWP应用程序,该应用程序使用了一些旧版本的Windows 10中不可用的功能。 因此,我需要检查是否安装了创作者更新。
应用程序中有使用 AnalyticsInfo.VersionInformation 的版本检查代码。 但是,最新一轮的WACK测试给出了以下失败:
失败 平台版本发布 • 发现错误:高操作系统版本验证检测到以下内容 错误:
o 无法停止应用程序 AppName.group.mbb。
o 应用程序 Company.AppName_2.3.56045.0_x64__cx08jceyq9bcp 失败 平台版本启动测试。
• 未修复的影响:应用不应使用版本信息来 提供特定于操作系统的功能。
•如何修复:请使用推荐的方法检查可用 操作系统中的功能。有关更多信息,请参阅下面的链接。 操作系统版本
我知道这个问题,但如果可能的话,宁愿修复失败。 我在这里找到了关于如何使 UWP 应用程序"版本自适应"的 MSDN 建议。
我现在有这个代码:
using Windows.Foundation.Metadata;
if (ApiInformation.IsMethodPresent("Windows.Networking.Connectivity.ConnectionProfile", "GetNetworkUsageAsync"))
{
//do stuff
}
我的Windows版本是1703 15063.483,GetNetworkUsageAsync在代码的其他地方成功使用。 但是对IsMethodPresent的调用总是返回false。
我的代码有什么问题?
有没有更好的功能可以检查,以了解是否安装了创作者更新?
更新: 我遵循了上述失败Microsoft指南,并将版本检查从AnalyticsInfo.VersionInfo更改为Windows.Foundation.Metadata.ApiInformation。 应用仍未通过 WACK 测试,并出现相同的错误。
第二次更新:
将Windows10更新到创意者更新,内部版本16251.0后,此错误在我的计算机上消失了。
也许像这样的帮手类?请注意,调用此内容的成本可能很高,因此建议执行此操作一次并缓存数据。
(更新:如果您使用Windows 组合 API,您会发现AreEffectsFast
和AreEffectsSupported
很有帮助,因为您可以使用它们根据用户的设备和操作系统条件打开和关闭效果。我扩展了下面的类,将它们公开为两个新属性。
public class BuildInfo
{
private static BuildInfo _buildInfo;
private BuildInfo()
{
if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 5))
{
Build = Build.FallCreators;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 4))
{
Build = Build.Creators;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3))
{
Build = Build.Anniversary;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 2))
{
Build = Build.Threshold2;
}
else if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 1))
{
Build = Build.Threshold1;
}
else
{
Build = Build.Unknown;
}
if (!BeforeCreatorsUpdate)
{
var capabilities = CompositionCapabilities.GetForCurrentView();
capabilities.Changed += (s, e) => UpdateCapabilities(capabilities);
UpdateCapabilities(capabilities);
}
void UpdateCapabilities(CompositionCapabilities capabilities)
{
AreEffectsSupported = capabilities.AreEffectsSupported();
AreEffectsFast = capabilities.AreEffectsFast();
}
}
public static Build Build { get; private set; }
public static bool AreEffectsFast { get; private set; }
public static bool AreEffectsSupported { get; private set; }
public static bool BeforeCreatorsUpdate => Build < Build.Creators;
public static BuildInfo RetrieveApiInfo() => _buildInfo ?? (_buildInfo = new BuildInfo());
}
public enum Build
{
Unknown = 0,
Threshold1 = 1507, // 10240
Threshold2 = 1511, // 10586
Anniversary = 1607, // 14393 Redstone 1
Creators = 1703, // 15063 Redstone 2
FallCreators = 1709 // 16299 Redstone 3
}
要初始化类,请在App.xaml.cs
中OnWindowCreated
后立即调用它。
protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
BuildInfo.RetrieveBuildInfo();
要使用它,只需调用
if (BuildInfo.Build == Build.Anniversary) { ... }
if (BuildInfo.BeforeCreatorsUpdate) { ... }
if (BuildInfo.AreEffectsFast) { ... }
试试这个
string deviceFamilyVersion= AnalyticsInfo.VersionInfo.DeviceFamilyVersion;
ulong version = ulong.Parse(deviceFamilyVersion);
ulong major = (version & 0xFFFF000000000000L) >> 48;
ulong minor = (version & 0x0000FFFF00000000L) >> 32;
ulong build = (version & 0x00000000FFFF0000L) >> 16;
ulong revision = (version & 0x000000000000FFFFL);
var osVersion = $"{major}.{minor}.{build}.{revision}";
源:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/2d8a7dab-1bad-4405-b70d-768e4cb2af96/uwp-get-os-version-in-an-uwp-app?forum=wpdevelop
使用 UWPCommunityToolkit 的 SystemInformation Helper。在使用 Microsoft.Toolkit.Uwp Nuget 包之前先安装它。
public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion;
使用它,您可以获得其他系统信息,例如设备型号,设备制造商等
有关详细信息,请参阅系统信息