Поделиться через


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

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

Существует 3 шага, чтобы убедиться, что ваше приложение поддерживает самый широкий спектр устройств Windows 10.

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

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

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

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

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

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

Подсказка

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

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

Установите целевой SDK в Visual Studio

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

Чтобы изменить минимальную и целевую версию проекта, который уже был создан в Visual Studio, перейдите на вкладку Project -> Properties -> Application tab -> Targeting.

Изменить целевой SDK в Visual Studio

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

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

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

Дополнительные сведения об обновлениях 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, и начиная с Windows 10, каждый API Windows Runtime является частью некоторого контракта API. При использовании контрактов API вы проверяете доступность определенной функции или API на устройстве, эффективно проверяя возможности устройства, а не проверяя наличие определенного устройства или ОС. Платформа, реализующая любой API в контракте API, необходима для реализации каждого API в этом контракте API. Это означает, что можно проверить, поддерживает ли запущенная ОС определённый API-контракт, и, если это так, вызвать любой API из данного контракта без проверки каждого по отдельности.

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

Замечание

Если у вас установлена предварительная версия Windows Software Development Kit (SDK), который еще не описан в документации, вы также можете найти сведения о поддержке контракта API в файле 'Platform.xml', расположенном в папке установки SDK '(Program Files (x86))\Windows Kits\10\Platforms<platform><SDK version>\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".