Использование настраиваемых свойств для расширений приложений

Свойства расширения приложения — это настраиваемое поле метаданных, предоставляемое разработчиком расширения в манифесте приложения. Узлы расширения приложения могут считывать эти метаданные при проверке расширений приложения, не загружая его содержимое.

Свойства являются необязательной, но очень полезной функцией. Существует широкий спектр возможных метаданных, которые могут потребоваться при создании платформы узла расширения приложения, такие как версия, возможности, списки поддерживаемых типов файлов или другие данные, которые полезно знать до загрузки расширения приложения. Эти данные могут определить способ загрузки расширения приложения. Вместо прогнозирования всех полей, которые могут потребоваться, свойства расширения приложения предоставляют открытый холст для определения того, что вам нужно, и что лучше всего подходит для вашего приложения.

Преимущества свойств расширения приложения

Есть две важные причины, почему вы должны воспользоваться свойствами расширения приложений.

  • Это простой и безопасный способ хранения основных или важных метаданных о платформе расширения вашего приложения, исключающий необходимость в сохранении этих сведений в файлы. Вы можете использовать его для таких важных концепций, как управление версиями, разрешения и принудительное исполнение. Например, ваше приложение может требовать, чтобы поле version было определено в свойствах и присутствовало в них, а также имело различное поведение при загрузке в зависимости от этого значения.

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

Объявление свойств

Свойства объявлены в файле Package.appxmanifest вашего пакета. Узел расширения может считывать их во время выполнения как набор свойств. Поскольку узел определяет платформу, то именно он должен сообщать разработчикам расширений о том, какие свойства доступны и должны быть помещены в объявление AppExtension.

Примечание

Конструктор манифестов в Visual Studio не поддерживает возможность определения свойств. Для определения свойств Package.appxmanifest необходимо отредактировать напрямую.

Чтобы объявить свойства, поместите их в элемент <uap3:Properties/> под вашим объявлением <uap3:AppExtension>. Вот пример объявления <uap3:AppExtension> для Microsoft Edge, которое использует свойства, поддерживаемые Edge.

<uap3:AppExtension Name="com.microsoft.edge.extension" Id="FirstExtension" PublicFolder="Extension" DisplayName="MyExtension">
  <uap3:Properties>
    <Capabilities>
      <Capability Name="websiteContent" />
      <Capability Name="websiteInfo" />
      <Capability Name="browserWebRequest" />
      <Capability Name="browserStorage" />
    </Capabilities>
  </uap3:Properties>
</uap3:AppExtension>

Служба Edge определила известное значение свойства Capabilities со списком объявленных возможностей расширения. Будучи основным элементом, вы можете поддерживать любые свойства, необходимые для ваших расширений приложения. Поскольку это набор свойств, вы также можете иметь вложенные свойства. Это хорошая идея иметь свойство версии корня, которое вы можете использовать, если измените форматы ваших расширений. Мы намеренно не ставили Version в качестве атрибута расширений приложения, чтобы не ограничивать вас использованием нашей семантики управления версиями. Вместо этого мы создали свойства, где версией может быть один из многих пользовательских атрибутов в любом виде и формате, который можно обрабатывать на свое усмотрение.

Использование свойств

Предположим, у вас есть простое свойство в расширениях приложения, которое описывает версию, например, следующее.

<uap3:Properties>
    <Version>1.0.0.0</Version>
</uap3:Properties>

Чтобы получить эти данные во время выполнения, в расширениях приложения достаточно вызвать GetExtensionPropertiesAsync().

string extensionVersion = "Unknown";
var properties = await ext.GetExtensionPropertiesAsync() as PropertySet;
if (properties != null)
{
    if (properties.ContainsKey("Version"))
    {
        PropertySet versionProperty = properties["Version"] as PropertySet;
        extensionVersion = versionProperty["#text"].ToString();
    }
}