【问题标题】:How to check the Windows 10 OS version in an UWP app so as to eliminate WACK test fail?如何在 UWP 应用中查看 Windows 10 操作系统版本以消除 WACK 测试失败?
【发布时间】:2017-08-03 09:30:03
【问题描述】:

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

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

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

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

o 应用 Company.AppName_2.3.56045.0_x64__cx08jceyq9bcp 失败 平台版本上线测试。

• 未修复的影响:应用不应使用版本信息 提供特定于操作系统的功能。

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

我知道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 测试并出现同样的错误。

第二次更新:
将 Windows10 更新到 Creators Update,Build 16251.0 后,此错误在我的计算机上消失了。

【问题讨论】:

  • 我已经测试了你的代码它对我来说返回 true。
  • 谢谢维杰。我不知道为什么它总是给我假。

标签: c# uwp windows-10 wack


【解决方案1】:

试试这个

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

【讨论】:

  • 正如我在问题中所说,这段代码似乎导致了 WACK 测试失败。
  • 借用他人代码时请注明出处。我已经更新了您的帖子以感谢原作者。
  • WACK 问题已经过时了,现在已经过去了。
【解决方案2】:

也许像这样的一个小助手类?请注意,调用这可能会很昂贵,因此建议执行一次并缓存数据。

(更新:如果您使用 Windows Composition API,您会发现 AreEffectsFast and 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) { ... }

【讨论】:

  • 谢谢!我要去试试这个。将 IsMethodPresent 用于单个方法怎么样,您认为这不是入门吗?
  • 我通常只是在方法上 F12 并检查它的 api 合同号以获取它运行的构建,并且没有特别使用像这样的单独检查。但是请随意将它添加到同一个帮助器类中。规则是你只想做一次检查。
  • 企业需要支持不同的Windows版本,是的,我们只检查一次!
  • @JustinXL FallCreators = 1709
  • 我已经对其进行了扩展,以适应创作者更新中的AreEffectsFastAreEffectsSupported。如果您曾经使用过 Composition,您可能会发现它们很有帮助。
【解决方案3】:

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

public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion;

使用它您可以获取其他系统信息,例如 DeviceModel、DeviceManufacturer 等

欲了解更多信息:SystemInformation

【讨论】:

  • 如果你检查它的来源,它实际上是在下面使用@Blue 的答案。
  • @JustinXL 我已经测试了这段代码。它成功通过了 WACK 测试。
  • 我们有使用 AnalyticsInfo.VersionInfo 的代码,它也通过了 WACK 测试。但是Fail的错误信息,专门告诉你使用Windows.Foundation.Metadata.ApiInformation。我不明白为什么这个失败来来去去,或者为什么另一张海报说他们的应用程序在 Windows 应用商店中被接受,尽管 WACK 测试失败了这个错误。我只是想让我的代码尽可能安全。
  • @JustinXL 根据nmetulev,这可能是由旧版本的 WACK 引起的。来源:WACK test FAILED due to SystemInformation.OperatingSystemVersion
  • 感谢@VijayNirmal
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2019-09-02
  • 2010-11-19
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多