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

时间:2017-08-03 09:30:03

标签: c# uwp windows-10 wack

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

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

  

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

     

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

     

o应用公司.AppName_2.3.56045.0_x64__cx08jceyq9bcp失败   平台版本启动测试。

     

•影响如果不修复:应用程序不应使用版本信息   提供特定于OS的功能。

     

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

我知道this question,但如果可能的话,宁愿修复失败。 我在MSDN上找到了关于如何制作UWP应用程序"版本自适应" here.

我现在有了这段代码:

using Windows.Foundation.Metadata;

if (ApiInformation.IsMethodPresent("Windows.Networking.Connectivity.ConnectionProfile", "GetNetworkUsageAsync"))
    {
        //do stuff
    }

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

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

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

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

3 个答案:

答案 0 :(得分:9)

也许这样的帮助类?注意调用它可能代价很高,因此建议一次执行此操作并缓存数据。

更新:如果您使用 Windows Composition API ,您会发现AreEffectsFast and AreEffectsSupported非常有用,因为您可以根据用户使用它们来打开和关闭效果#39;设备和操作系统条件。我已经扩展了下面的类,将它们作为两个新属性公开。)

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
}

要初始化课程,请在OnWindowCreated App.xaml.cs之后立即拨打电话。

protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
    BuildInfo.RetrieveBuildInfo();

要使用它,只需致电

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

if (BuildInfo.BeforeCreatorsUpdate) { ... }

if (BuildInfo.AreEffectsFast) { ... }

答案 1 :(得分:2)

试试这个

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

答案 2 :(得分:2)

使用UWPCommunityToolkit的SystemInformation Helper。在使用之前安装Microsoft.Toolkit.Uwp Nuget包。

public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion;

使用此功能,您可以获得其他系统信息,如DeviceModel,DeviceManufacturer等

了解更多信息:SystemInformation