Адаптивные версии приложений: использование новых API при сохранении совместимости с предыдущими версиями

Каждый выпуск пакета SDK для Windows 10 добавляет захватывающие новые функциональные возможности, которые вы хотите воспользоваться преимуществами. Однако не все клиенты будут обновлять свои устройства до последней версии Windows 10 одновременно, и вы хотите убедиться, что ваше приложение работает на самом широком диапазоне устройств. Здесь мы покажем, как создать приложение таким образом, чтобы оно выполнялось в более ранних версиях Windows 10, но также использует новые возможности при каждом запуске приложения на устройстве с установленным последним обновлением.

Чтобы приложение поддерживало максимальное количество устройств с Windows 10, необходимо выполнить три действия.

  • Сначала настройте проект Visual Studio для назначения последних API. Это влияет на то, что происходит при компиляции приложения.
  • Во-вторых, выполните проверка среды выполнения, чтобы убедиться, что на устройстве запущены только API-интерфейсы.
  • В-третьих, протестируйте свое приложение в минимальной и целевой версиях Windows 10.

Настройка проекта Visual Studio

Первым шагом в поддержке нескольких версий Windows 10 является указание целевых и минимальных поддерживаемых версий ОС/SDK в проекте Visual Studio.

  • Целевой объект: версия пакета SDK, в которую Visual Studio компилирует код приложения и выполняет все средства. Все API и ресурсы в этой версии пакета SDK доступны в коде приложения во время компиляции.
  • Минимальный: версия пакета SDK, поддерживающая последнюю версию ОС, в которую приложение может работать (и будет развернуто в магазине) и версия, в которую Visual Studio компилирует код разметки приложения.

Во время выполнения приложение будет работать с версией ОС, в которую она развернута, поэтому ваше приложение будет вызывать исключения, если вы используете ресурсы или вызываете API, которые недоступны в этой версии. Мы покажем, как использовать проверка среды выполнения для вызова правильных API далее в этой статье.

Параметры "Целевой" и "Минимальный" указывают конечные точки диапазона версий OS/SDK. Однако при тестировании приложения на минимальной версии можно убедиться, что она будет выполняться в любых версиях между минимальной и целевой версией.

Совет

Visual Studio не предупреждает о совместимости API. Вы несете ответственность за тестирование и убедитесь, что ваше приложение работает должным образом во всех версиях ОС между минимальной и целевой версией.

При создании проекта в Visual Studio 2015 с обновлением 2 или более поздней версии вам будет предложено задать поддерживаемые приложением целевые и минимальные версии. По умолчанию целевая версия является самой высокой установленной версией пакета SDK, и минимальная версия является самой низкой установленной версией пакета SDK. Вы можете выбрать целевой и минимальный только из версий пакета SDK, установленных на компьютере.

Set the target SDK in Visual Studio

Обычно рекомендуется оставить значения по умолчанию. Однако если у вас установлена предварительная версия пакета SDK и вы пишете рабочий код, необходимо изменить целевую версию пакета SDK на последнюю официальную версию пакета SDK.

Чтобы изменить минимальную и целевую версию для проекта, который уже создан в Visual Studio, перейдите в меню "Проект" -> "Свойства" -> вкладка "Приложения" -> "Нацеливание".

Change the target SDK in Visual Studio

В следующей таблице для справки представлены номера сборки для каждого пакета SDK.

Понятное имя Версия Сборка ОС или пакета SDK
RTM 1507 10240
Обновление за ноябрь 1511 10586
Юбилейное обновление 1607 14393
Creators Update 1703 15063
Обновление Fall Creators Update 1709 16299
Обновление за апрель 2018 г. 1803 17134
Обновление за октябрь 2018 г. 1809 17763
Обновление за май 2019 г. 1903 18362

Вы можете скачать любую выпущенную версию пакета SDK из пакета SDK для Windows и архив эмулятора. Вы можете скачать последнюю версию пакета SDK предварительной версии Windows из раздела разработчика сайта предварительной оценки Windows.

Дополнительные сведения об обновлениях Windows 10 см. в разделе Сведения о выпуске Windows 10. Важные сведения о жизненном цикле поддержки Windows 10 приведены в документе Данные о жизненном цикле Windows.

Выполнение проверок API

В основе приложений с адаптивным к версии кодом — сочетание контрактов API и класса ApiInformation. Этот класс позволяет обнаруживать присутствие указанного контракта API, типа или участника, чтобы можно было безопасно выполнять вызовы API на разных устройствах и в разных версиях ОС.

Контракты API

Набор API в семействе устройств разбивается на промежуточные разделы, известные как контракты API. Для проверки наличия контракта API можно использовать метод ApiInformation.IsApiContractPresent . Это полезно, если вы хотите протестировать наличие большого количества API, которые существуют в той же версии контракта API.

    bool isScannerDeviceContract_1_Present =
        Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
            ("Windows.Devices.Scanners.ScannerDeviceContract", 1);

Что такое контракт API? По существу, контракт API представляет компонент — набор соответствующих интерфейсов API, которые в совокупности обеспечивают определенную функциональность. Гипотетический контракт API мог бы представлять набор API, содержащих два класса, пять интерфейсов, одну структуру, два перечисления и т. д.

Логически связанные типы группируются в контракт API, а начиная с Windows 10 каждый API среды выполнения Windows является участником определенного контракта API. Работая с контрактами API, вы проверяете доступность определенной функции или API на устройстве, тем самым, по сути, проверяя возможности устройства, а не наличия определенного устройства или ОС. Платформа, которая реализует какой-либо API в контракте API, необходима для реализации каждого API в этом контракте API. Это означает, что можно проверить, поддерживает ли используемая ОС определенный контракт API, и если да, то вызвать любые API в соответствующем контракте API, не проверяя каждый по отдельности.

Самый крупный и распространенный контракт API — Windows.Foundation.UniversalApiContract. Он содержит большинство API универсальной платформы Windows. В документации по пакетам SDK расширения для семейства устройств и контрактам API описаны разные доступные контракты API. Вы увидите, что большинство из них представляют набор функционально связанных API.

Примечание.

Если установлена предварительная версия пакета SDK для Windows, которая еще не отражена в документах, найти информацию о поддержке контракта API можно в файле Platform.xml, который находится в установочной папке пакета SDK по пути "(Program Files (x86))\Windows Kits\10\Platforms<платформа><версия пакета SDK>\Platform.xml".

Адаптивный к версии код и условный код XAML

Во всех версиях Windows 10 в своем коде можно использовать класс ApiInformation в условном выражении, чтобы проверить наличие API, который вы хотите вызвать. В адаптивном коде можно использовать различные методы класса, включая IsTypePresent, IsEventPresent, IsMethodPresent и IsPropertyPresent, чтобы проверять интерфейсы API с нужным уровнем детализации.

Дополнительные сведения и примеры см. в разделе Адаптивный к версии код.

Если минимальная версия ваших приложений — сборка 15063 (Creators Update) или выше, для задания свойств и создания экземпляров объектов в разметке без использования кода программной части можно использовать условный код XAML. Условный код XAML обеспечивает возможность использовать метод ApiInformation.IsApiContractPresent в разметке.

Дополнительные сведения и примеры см. в разделе Условный код XAML.

Интерфейсы API с отложенной загрузкой

Функция QueryOptionalDelayLoadedAPI позволяет приложениям из Store (которым политика запрещает вызывать LoadLibrary) определить, была ли обнаружена их функция с отложенной загрузкой.

#include <windows.h>
#include <commdlg.h>
#include <libloaderapi2.h>
#include <stdio.h>

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HMODULE_THISCOMPONENT reinterpret_cast<HMODULE>(&__ImageBase)

int __cdecl main(int argc, char** argv)
{
    if (QueryOptionalDelayLoadedAPI(HMODULE_THISCOMPONENT,
          "comdlg32.dll", "GetOpenFileNameW", 0))
    {
        printf("GetOpenFileNameW can be called!\n");
    }
    return 0;
}

Проверка адаптивного к версии приложения

При использовании адаптивного к версии кода или условного кода XAML для создания адаптивного к версии приложения необходимо протестировать его на устройстве с минимальной версией и на устройстве с целевой версией Windows 10.

Невозможно протестировать все ветвления условного кода на одном устройстве. Чтобы гарантировать тестирование всех ветвлений кода, необходимо развернуть и протестировать приложение на удаленном устройстве (или виртуальной машине) с минимальной поддерживаемой версией ОС. Дополнительные сведения об удаленной отладке см. в разделе Развертывание и отладка приложений UWP.