Как проверить версию ОС Windows 10 в приложении UWP, чтобы устранить ошибку теста WACK?

Я работаю над приложением UWP, которое использует некоторые функции, которые недоступны в более старых версиях Windows 10. Поэтому мне нужно проверить, установлено ли обновление Creators.

В приложении есть код проверки версии, использующий 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
    }

Моя версия Windows 1703 15063.483, и GetNetworkUsageAsync успешно используется в другом месте кода. Но вызов IsMethodPresent всегда возвращает false.

Что не так с моим кодом?
И есть ли лучшая функция для проверки, чтобы узнать, установлено ли обновление Creators?

ОБНОВЛЕНИЕ: я следовал рекомендациям Microsoft для вышеуказанного сбоя и изменил проверку версии с AnalyticsInfo.VersionInfo на Windows.Foundation.Metadata.ApiInformation. Приложение по-прежнему не проходит тест WACK с той же ошибкой.

2-е ОБНОВЛЕНИЕ:
После обновления Windows10 до Creators Update, Build 16251.0, эта ошибка исчезла на моем компьютере.

3 ответа

Решение

Может быть, немного вспомогательный класс, как это? Обратите внимание, что вызов этого может быть дорогостоящим, поэтому рекомендуется сделать это один раз и кэшировать данные.

(Обновление: если вы используете 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
}

Чтобы инициализировать класс, назовите его сразу после OnWindowCreated в вашем App.xaml.cs,

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

Используйте SystemInformation Helper от UWPCommunityToolkit. Установите пакет Microsoft.Toolkit.Uwp Nuget перед его использованием.

public OSVersion OperatingSystemVersion => SystemInformation.OperatingSystemVersion;

Используя это, вы можете получить другую системную информацию, такую ​​как DeviceModel, DeviceManufacturer и т. Д.

Для получения дополнительной информации: SystemInformation

Другие вопросы по тегам