如何检查UWP应用程序中的Windows 10操作系统版本以消除WACK测试失败?

use*_*145 4 c# windows-10 uwp wack

我正在开发一个UWP应用程序,该应用程序使用旧版Windows 10中不可用的某些功能.因此,我需要检查是否安装了Creators Update.

应用程序中有使用AnalyticsInfo.VersionInfo的版本检查代码.然而,最新一轮的WACK测试给出了以下失败:

FAILED平台版本启动•发现错误:高操作系统版本验证检测到以下错误:

o无法停止应用AppName.group.mbb.

o应用程序Company.AppName_2.3.56045.0_x64__cx08jceyq9bcp失败的平台版本启动测试.

•影响如果不修复:应用程序不应使用版本信息来提供特定于操作系统的功能.

•如何修复:请使用推荐的方法检查操作系统中的可用功能.有关详细信息,请参阅以下链接.操作系统版本

我知道这个问题,但如果可能的话,宁愿修复失败.我在MSDN上找到了关于如何在这里制作UWP应用程序"版本自适应"的建议.

我现在有这个代码:

using Windows.Foundation.Metadata;

if (ApiInformation.IsMethodPresent("Windows.Networking.Connectivity.ConnectionProfile", "GetNetworkUsageAsync"))
    {
        //do stuff
    }
Run Code Online (Sandbox Code Playgroud)

我的Windows版本是1703 15063.483,并且GetNetworkUsageAsync在代码中的其他位置成功使用.但是对IsMethodPresent的调用总是返回false.

我的代码出了什么问题?
是否有更好的功能来检查,知道是否安装了Creators Update?

更新:我遵循Microsoft针对上述失败的指导原则,并将版本检查从AnalyticsInfo.VersionInfo更改为Windows.Foundation.Metadata.ApiInformation.该应用程序仍然无法通过WACK测试同样的错误.

第2次更新:
将Windows10更新为Creators Update,Build 16251.0后,此错误在我的计算机上消失.

Jus*_* XL 9

也许有点像这样的帮手类?注意调用它可能是昂贵的,因此建议一次执行此操作并缓存数据.

(更新:如果您使用Windows Composition 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
}
Run Code Online (Sandbox Code Playgroud)

初始化类,之后把它OnWindowCreated在你的App.xaml.cs.

protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
    BuildInfo.RetrieveBuildInfo();
Run Code Online (Sandbox Code Playgroud)

要使用它,只需致电

if (BuildInfo.Build == Build.Anniversary) { ... }

if (BuildInfo.BeforeCreatorsUpdate) { ... }

if (BuildInfo.AreEffectsFast) { ... }
Run Code Online (Sandbox Code Playgroud)

  • @JustinXL`FallCreators = 1709` (2认同)

Blu*_*lue 6

尝试这个

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}";
Run Code Online (Sandbox Code Playgroud)

来源:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/2d8a7dab-1bad-4405-b70d-768e4cb2af96/uwp-get-os-version-in-an-uwp-app?forum=wpdevelop