5

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

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

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

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
    }

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

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

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

第二次更新:
将 Windows10 更新到 Creators Update,Build 16251.0 后,这个错误在我的电脑上消失了。

4

3 回答 3

10

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

更新:如果您使用Windows 组合 API,您会发现AreEffectsFastAreEffectsSupported很有帮助,因为您可以使用它们根据用户的设备和操作系统条件来打开和关闭效果。我扩展了下面的类以将它们公开为两个新属性。)

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
}

要初始化该类,请OnWindowCreatedApp.xaml.cs.

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

要使用它,只需调用

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

if (BuildInfo.BeforeCreatorsUpdate) { ... }

if (BuildInfo.AreEffectsFast) { ... }
于 2017-08-03T10:01:08.273 回答
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}";

资源:

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

于 2017-08-03T09:43:22.067 回答
2

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

public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion;

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

更多信息:系统信息

于 2017-08-03T11:10:18.997 回答