Покупки и пробные версии в приложении с помощью пространства имен Windows.ApplicationModel.Store

Вы можете использовать члены в пространстве имен Windows.ApplicationModel.Store для добавления покупок в приложение универсальная платформа Windows (UWP), чтобы помочь монетизировать приложение. Эти API также предоставляют доступ к сведениям о лицензии для вашего приложения.

В статьях этого раздела приведены подробные рекомендации и примеры кода для использования элементов в пространстве имен Windows.ApplicationModel.Store для нескольких распространенных сценариев. Общие сведения о базовых понятиях, связанных с покупками в приложениях UWP, см. в разделе "Покупки в приложении" и пробные версии. Полный пример, демонстрирующий реализацию пробных версий и покупок в приложении с помощью пространства имен Windows.ApplicationModel.Store , см. в примере Магазина.

Внимание

Пространство имен Windows.ApplicationModel.Store больше не обновляется с новыми функциями. Если проект предназначен для Windows 10 Anniversary Edition (10.0; Сборка 14393) или более поздней версии в Visual Studio (то есть вы используете Windows 10 версии 1607 или более поздней версии), рекомендуется использовать пространство имен Windows.Services.Store . Дополнительные сведения см. в разделе "Покупки в приложении" и пробные версии. Пространство имен Windows.ApplicationModel.Store не поддерживается в классических приложениях Windows, использующих мост для классических приложений или в приложениях или играх, использующих песочницу разработки в Центре партнеров (например, это относится к любой игре, которая интегрируется с Xbox Live). Эти продукты должны использовать пространство имен Windows.Services.Store для реализации покупок и пробных версий в приложении.

Начало работы с классами CurrentApp и CurrentAppSimulator

Основная точка входа в пространство имен Windows.ApplicationModel.Storeкласс CurrentApp . Этот класс предоставляет статические свойства и методы, которые можно использовать для получения сведений о текущем приложении и его доступных надстройках, получения сведений о лицензии для текущего приложения или его надстроек, приобретения приложения или надстройки для текущего пользователя и выполнения других задач.

Класс CurrentApp получает свои данные из Microsoft Store, поэтому у вас должна быть учетная запись разработчика и приложение должно быть опубликовано в Магазине, прежде чем успешно использовать этот класс в приложении. Перед отправкой приложения в Магазин можно протестировать код с имитированной версией этого класса с именем CurrentAppSimulator. После тестирования приложения и перед отправкой его в Microsoft Store необходимо заменить экземпляры CurrentAppSimulator на CurrentApp. Ваше приложение завершится ошибкой сертификации, если оно использует CurrentAppSimulator.

При использовании CurrentAppSimulator начальное состояние лицензирования и продуктов приложения в приложении описывается в локальном файле на компьютере разработки с именем WindowsStoreProxy.xml. Дополнительные сведения об этом файле см. в разделе "Использование файла WindowsStoreProxy.xml с CurrentAppSimulator".

Дополнительные сведения о распространенных задачах, которые можно выполнить с помощью CurrentApp и CurrentAppSimulator, см. в следующих статьях.

Раздел Описание
Исключение или ограничение функций в пробной версии Если вы позволяете клиентам бесплатно использовать свое приложение в течение пробного периода, вы можете заставить клиентов обновить до полной версии приложения, исключив или ограничив некоторые функции в течение пробного периода.
Включение покупок продуктов в приложении Независимо от того, является ли ваше приложение бесплатным или нет, вы можете продавать содержимое, другие приложения или новые функции приложений (например, разблокировать следующий уровень игры) прямо в приложении. Здесь мы покажем, как включить эти продукты в приложении.
Включение покупки потребляемых продуктов в приложении Предложить потребляемые продукты в приложении — элементы, которые можно приобрести, использовать и приобрести снова— через платформу магазина для предоставления клиентам возможности покупки, которая является надежной и надежной. Это особенно полезно для таких вещей, как валюта в игре (золото, монеты и т. д.), которые можно приобрести, а затем использовать для приобретения конкретных power ups.
Управление большим каталогом продуктов в приложении Если ваше приложение предлагает большой каталог продуктов в приложении, вы можете при необходимости следовать процессу, описанному в этом разделе, чтобы помочь управлять каталогом.
Использование квитанций для проверки покупок продуктов Каждая транзакция Microsoft Store, которая приводит к успешной покупке продукта, может при необходимости возвращать квитанцию о транзакциях, которая предоставляет сведения о указанном продукте и денежной стоимости клиенту. Доступ к этой информации поддерживает сценарии, в которых приложение должно убедиться, что пользователь приобрел приложение или сделал покупки в приложении из Microsoft Store.

Использование файла WindowsStoreProxy.xml с CurrentAppSimulator

При использовании CurrentAppSimulator начальное состояние лицензирования и продуктов приложения в приложении описывается в локальном файле на компьютере разработки с именем WindowsStoreProxy.xml. Методы CurrentAppSimulator , изменяющие состояние приложения, например путем покупки лицензии или обработки покупки в приложении, обновляют только состояние объекта CurrentAppSimulator в памяти. Содержимое WindowsStoreProxy.xml не изменяется. Когда приложение начинается снова, состояние лицензии возвращается к тому, что описано в WindowsStoreProxy.xml.

Файл WindowsStoreProxy.xml создается по умолчанию по умолчанию в следующем расположении: %UserProfile%\AppData\Local\Packages<\Package>\LocalState\Microsoft\Windows Store\ApiData. Этот файл можно изменить, чтобы определить сценарий, который требуется имитировать в свойствах CurrentAppSimulator .

Хотя значения в этом файле можно изменить, рекомендуется создать собственный файл WindowsStoreProxy.xml (в папке данных проекта Visual Studio) для CurrentAppSimulator , чтобы вместо этого использовать. При имитации транзакции вызовите ReloadSimulatorAsync для загрузки файла. Если вы не вызываете ReloadSimulatorAsync для загрузки собственного файла WindowsStoreProxy.xml, CurrentAppSimulator создаст или загружает (но не перезаписывает) файл по умолчанию WindowsStoreProxy.xml.

Примечание.

Помните, что CurrentAppSimulator не полностью инициализирован до завершения reloadSimulatorAsync. И, так как ReloadSimulatorAsync является асинхронным методом, необходимо принять меры, чтобы избежать состояния гонки запроса CurrentAppSimulator на одном потоке во время инициализации на другом. Одним из способов является использование флага для указания завершения инициализации. Приложение, установленное из Microsoft Store, должно использовать CurrentApp вместо CurrentAppSimulator, и в этом случае ReloadSimulatorAsync не вызывается, поэтому только что упоминаемое условие гонки не применяется. По этой причине создайте код таким образом, чтобы он работал в обоих случаях как асинхронно, так и синхронно.

Примеры

Этот пример представляет собой файл WindowsStoreProxy.xml (кодировка UTF-16), описывающий приложение с пробным режимом, истекающим в 05:00 (UTC) 19 января 2015 г.

<?xml version="1.0" encoding="UTF-16"?>
<CurrentApp>
  <ListingInformation>
    <App>
      <AppId>2B14D306-D8F8-4066-A45B-0FB3464C67F2</AppId>
      <LinkUri>http://apps.windows.microsoft.com/app/2B14D306-D8F8-4066-A45B-0FB3464C67F2</LinkUri>
      <CurrentMarket>en-US</CurrentMarket>
      <AgeRating>3</AgeRating>
      <MarketData xml:lang="en-us">
        <Name>App with a trial license</Name>
        <Description>Sample app for demonstrating trial license management</Description>
        <Price>4.99</Price>
        <CurrencySymbol>$</CurrencySymbol>
      </MarketData>
    </App>
  </ListingInformation>
  <LicenseInformation>
    <App>
      <IsActive>true</IsActive>
      <IsTrial>true</IsTrial>
      <ExpirationDate>2015-01-19T05:00:00.00Z</ExpirationDate>
    </App>
  </LicenseInformation>
  <Simulation SimulationMode="Automatic">
    <DefaultResponse MethodName="LoadListingInformationAsync_GetResult" HResult="E_FAIL"/>
  </Simulation>
</CurrentApp>

Следующий пример — это файл WindowsStoreProxy.xml (в кодировке UTF-16), описывающий приложение, которое было приобретено, имеет функцию, которая истекает в 05:00 (UTC) 19 января 2015 г. и имеет потребляемую покупку в приложении.

<?xml version="1.0" encoding="utf-16" ?>
<CurrentApp>
  <ListingInformation>
    <App>
      <AppId>988b90e4-5d4d-4dea-99d0-e423e414ffbc</AppId>
      <LinkUri>http://apps.windows.microsoft.com/app/988b90e4-5d4d-4dea-99d0-e423e414ffbc</LinkUri>
      <CurrentMarket>en-us</CurrentMarket>
      <AgeRating>3</AgeRating>
      <MarketData xml:lang="en-us">
        <Name>App with several in-app products</Name>
        <Description>Sample app for demonstrating an expiring in-app product and a consumable in-app product</Description>
        <Price>5.99</Price>
        <CurrencySymbol>$</CurrencySymbol>
      </MarketData>
    </App>
    <Product ProductId="feature1" LicenseDuration="10" ProductType="Durable">
      <MarketData xml:lang="en-us">
        <Name>Expiring Item</Name>
        <Price>1.99</Price>
        <CurrencySymbol>$</CurrencySymbol>
      </MarketData>
    </Product>
    <Product ProductId="consumable1" LicenseDuration="0" ProductType="Consumable">
      <MarketData xml:lang="en-us">
        <Name>Consumable Item</Name>
        <Price>2.99</Price>
        <CurrencySymbol>$</CurrencySymbol>
      </MarketData>
    </Product>
  </ListingInformation>
  <LicenseInformation>
    <App>
      <IsActive>true</IsActive>
      <IsTrial>false</IsTrial>
    </App>
    <Product ProductId="feature1">
      <IsActive>true</IsActive>
      <ExpirationDate>2015-01-19T00:00:00.00Z</ExpirationDate>
    </Product>
  </LicenseInformation>
  <ConsumableInformation>
    <Product ProductId="consumable1" TransactionId="00000001-0000-0000-0000-000000000000" Status="Active"/>
  </ConsumableInformation>
</CurrentApp>

Схема

В этом разделе перечислены XSD-файл, определяющий структуру файла WindowsStoreProxy.xml. Чтобы применить эту схему к редактору XML в Visual Studio при работе с файлом WindowsStoreProxy.xml, сделайте следующее:

  1. Откройте файл WindowsStoreProxy.xml в Visual Studio.
  2. В меню XML нажмите кнопку "Создать схему". При этом будет создан временный файл WindowsStoreProxy.xsd на основе содержимого XML-файла.
  3. Замените содержимое этого XSD-файла схемой ниже.
  4. Сохраните файл в расположении, где его можно применить к нескольким проектам приложений.
  5. Перейдите к файлу WindowsStoreProxy.xml в Visual Studio.
  6. В меню XML щелкните схемы, а затем найдите строку в списке для файла WindowsStoreProxy.xsd. Если расположение файла не является нужным (например, если временный файл по-прежнему отображается), нажмите кнопку "Добавить". Перейдите к правому файлу и нажмите кнопку "ОК". Теперь вы увидите этот файл в списке. Убедитесь, что флажок отображается в столбце Use для этой схемы.

После этого изменения, внесенные в WindowsStoreProxy.xml, будут применяться к схеме. Дополнительные сведения см. в разделе "How to: Select the XML Schemas to Use".

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import namespace="http://www.w3.org/XML/1998/namespace"/>
  <xs:element name="CurrentApp" type="CurrentAppDefinition"></xs:element>
  <xs:complexType name="CurrentAppDefinition">
    <xs:sequence>
      <xs:element name="ListingInformation" type="ListingDefinition" minOccurs="1" maxOccurs="1"/>
      <xs:element name="LicenseInformation" type="LicenseDefinition" minOccurs="1" maxOccurs="1"/>
      <xs:element name="ConsumableInformation" type="ConsumableDefinition" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Simulation" type="SimulationDefinition" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="ResponseCodes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="S_OK">
        <xs:annotation>
          <xs:documentation>0x00000000</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="E_INVALIDARG">
        <xs:annotation>
          <xs:documentation>0x80070057</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="E_CANCELLED">
        <xs:annotation>
          <xs:documentation>0x800704C7</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="E_FAIL">
        <xs:annotation>
          <xs:documentation>0x80004005</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="E_OUTOFMEMORY">
        <xs:annotation>
          <xs:documentation>0x8007000E</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="ERROR_ALREADY_EXISTS">
        <xs:annotation>
          <xs:documentation>0x800700B7</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ConsumableStatus">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Active"/>
      <xs:enumeration value="PurchaseReverted"/>
      <xs:enumeration value="PurchasePending"/>
      <xs:enumeration value="ServerError"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="StoreMethodName">
    <xs:restriction base="xs:string">
      <xs:enumeration value="RequestAppPurchaseAsync_GetResult" id="RPPA"/>
      <xs:enumeration value="RequestProductPurchaseAsync_GetResult" id="RFPA"/>
      <xs:enumeration value="LoadListingInformationAsync_GetResult" id="LLIA"/>
      <xs:enumeration value="ReportConsumableFulfillmentAsync_GetResult" id="RPFA"/>
      <xs:enumeration value="LoadListingInformationByKeywordsAsync_GetResult" id="LLIKA"/>
      <xs:enumeration value="LoadListingInformationByProductIdAsync_GetResult" id="LLIPA"/>
      <xs:enumeration value="GetUnfulfilledConsumablesAsync_GetResult" id="GUC"/>
      <xs:enumeration value="GetAppReceiptAsync_GetResult" id="GARA"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SimulationMode">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Interactive"/>
      <xs:enumeration value="Automatic"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="ListingDefinition">
    <xs:sequence>
      <xs:element name="App" type="AppListingDefinition"/>
      <xs:element name="Product" type="ProductListingDefinition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ConsumableDefinition">
    <xs:sequence>
      <xs:element name="Product" type="ConsumableProductDefinition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AppListingDefinition">
    <xs:sequence>
      <xs:element name="AppId" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="LinkUri" type="xs:anyURI" minOccurs="1" maxOccurs="1"/>
      <xs:element name="CurrentMarket" type="xs:language" minOccurs="1" maxOccurs="1"/>
      <xs:element name="AgeRating" type="xs:unsignedInt" minOccurs="1" maxOccurs="1"/>
      <xs:element name="MarketData" type="MarketSpecificAppData" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="MarketSpecificAppData">
    <xs:sequence>
      <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Description" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Price" type="xs:float" minOccurs="1" maxOccurs="1"/>
      <xs:element name="CurrencySymbol" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="CurrencyCode" type="xs:string" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute ref="xml:lang" use="required"/>
  </xs:complexType>
  <xs:complexType name="MarketSpecificProductData">
    <xs:sequence>
      <xs:element name="Name" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Price" type="xs:float" minOccurs="1" maxOccurs="1"/>
      <xs:element name="CurrencySymbol" type="xs:string" minOccurs="1" maxOccurs="1"/>
      <xs:element name="CurrencyCode" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Description" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Tag" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Keywords" type="KeywordDefinition" minOccurs="0" maxOccurs="1"/>
      <xs:element name="ImageUri" type="xs:anyURI" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute ref="xml:lang" use="required"/>
  </xs:complexType>
  <xs:complexType name="ProductListingDefinition">
    <xs:sequence>
      <xs:element name="MarketData" type="MarketSpecificProductData" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="ProductId" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:maxLength value="100"/>
          <xs:pattern value="[^,]*"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="LicenseDuration" type="xs:integer" use="optional"/>
    <xs:attribute name="ProductType" type="xs:string" use="optional"/>
  </xs:complexType>
  <xs:simpleType name="guid">
    <xs:restriction base="xs:string">
      <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="ConsumableProductDefinition">
    <xs:attribute name="ProductId" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:maxLength value="100"/>
          <xs:pattern value="[^,]*"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="TransactionId" type="guid" use="required"/>
    <xs:attribute name="Status" type="ConsumableStatus" use="required"/>
    <xs:attribute name="OfferId" type="xs:string" use="optional"/>
  </xs:complexType>
  <xs:complexType name="LicenseDefinition">
    <xs:sequence>
      <xs:element name="App" type="AppLicenseDefinition"/>
      <xs:element name="Product" type="ProductLicenseDefinition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="AppLicenseDefinition">
    <xs:sequence>
      <xs:element name="IsActive" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
      <xs:element name="IsTrial" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
      <xs:element name="ExpirationDate" type="xs:dateTime" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ProductLicenseDefinition">
    <xs:sequence>
      <xs:element name="IsActive" type="xs:boolean" minOccurs="1" maxOccurs="1"/>
      <xs:element name="ExpirationDate" type="xs:dateTime" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="ProductId" type="xs:string" use="required"/>
    <xs:attribute name="OfferId" type="xs:string" use="optional"/>
  </xs:complexType>
  <xs:complexType name="SimulationDefinition" >
    <xs:sequence>
      <xs:element name="DefaultResponse" type="DefaultResponseDefinition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="SimulationMode" type="SimulationMode" use="optional"/>
  </xs:complexType>
  <xs:complexType name="DefaultResponseDefinition">
    <xs:attribute name="MethodName" type="StoreMethodName" use="required"/>
    <xs:attribute name="HResult" type="ResponseCodes" use="required"/>
  </xs:complexType>
  <xs:complexType name="KeywordDefinition">
    <xs:sequence>
      <xs:element name="Keyword" type="xs:string" minOccurs="0" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Описания элементов и атрибутов

В этом разделе описываются элементы и атрибуты в файле WindowsStoreProxy.xml.

Корневой элемент этого файла — это элемент CurrentApp , представляющий текущее приложение. Этот элемент содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
ПеречислениеInformation Да 1 Содержит данные из списка приложения.
LicenseInformation Да 1 Описывает лицензии, доступные для этого приложения и его устойчивых надстроек.
Потребляемая информация No 0 или 1 Описывает используемые надстройки, доступные для этого приложения.
Симуляция No 0 или 1 Описывает, как вызовы различных методов CurrentAppSimulator будут работать в приложении во время тестирования.

Элемент ListingInformation

Этот элемент содержит данные из списка приложения. ListingInformation является обязательным дочерним элементом элемента CurrentApp .

ListingInformation содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
Приложение Да 1 Предоставляет данные о приложении.
Продукт No 0 и более Описывает надстройку для приложения.

Элемент App (дочерний элемент ListingInformation)

Этот элемент описывает лицензию приложения. Приложение является обязательным дочерним элементом Объекта ListingInformation .

Приложение содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
AppId Да 1 GUID, определяющий приложение в Магазине. Это может быть любой GUID для тестирования.
LinkUri Да 1 Универсальный код ресурса (URI) страницы описания в магазине. Это может быть любой допустимый URI для тестирования.
CurrentMarket Да 1 Страна или регион клиента.
AgeRating Да 1 Целое число, представляющее минимальный возрастной рейтинг приложения. Это то же значение, которое вы указали в Центре партнеров при отправке приложения. Значения, используемые Магазином: 3, 7, 12 и 16. Дополнительные сведения об этих рейтингах см. в разделе "Возрастные рейтинги".
MarketData Да 1 или более Содержит сведения о приложении для определенной страны или региона. Для каждой страны или региона, в которой указано приложение, необходимо включить элемент MarketData .

Элемент MarketData (дочерний элемент App)

Этот элемент содержит сведения о приложении для определенной страны или региона. Для каждой страны или региона, в которой указано приложение, необходимо включить элемент MarketData . MarketData является обязательным дочерним элементом элемента App .

MarketData содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
Полное имя Да 1 Имя приложения в этой стране или регионе.
Description Да 1 Описание приложения для этой страны или региона.
Price Да 1 Цена приложения в этой стране или регионе.
CurrencySymbol Да 1 Символ валюты, используемый в этой стране или регионе.
CurrencyCode No 0 или 1 Код валюты, используемый в этой стране или регионе.

MarketData имеет следующие атрибуты.

Атрибут Обязательное поле Описание
xml:lang Да Указывает страну или регион, для которого применяются сведения о данных рынка.

Элемент Product (дочерний элемент ListingInformation)

Этот элемент описывает надстройку для приложения. Продукт является необязательным дочерним элементом Элемента ListingInformation и содержит один или несколько элементов MarketData .

Продукт имеет следующие атрибуты.

Атрибут Обязательное поле Описание
ProductId Да Содержит строку, используемую приложением для идентификации надстройки.
LicenseDuration No Указывает количество дней, в течение которых лицензия будет действительна после покупки элемента. Дата окончания срока действия новой лицензии, созданной покупкой продукта, — это дата покупки, а также длительность лицензии. Этот атрибут используется только в том случае, если атрибут ProductType является устойчивым. Этот атрибут игнорируется для потребляемых надстроек.
ProductType No Содержит значение для идентификации сохраняемости продукта в приложении. Поддерживаемые значения: Устойчивые (по умолчанию) и Потребляемые. Для устойчивых типов дополнительные сведения описываются элементом Product в разделе LicenseInformation. Для потребляемых типов дополнительные сведения описываются элементом Product в разделе ConsumableInformation.

Элемент MarketData (дочерний элемент Product)

Этот элемент содержит сведения о надстройке для определенной страны или региона. Для каждой страны или региона, в которой указана надстройка, необходимо включить элемент MarketData . MarketData является обязательным дочерним элементом элемента Product .

MarketData содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
Полное имя Да 1 Имя надстройки в этой стране или регионе.
Price Да 1 Цена надстройки в этой стране или регионе.
CurrencySymbol Да 1 Символ валюты, используемый в этой стране или регионе.
CurrencyCode No 0 или 1 Код валюты, используемый в этой стране или регионе.
Description No 0 или 1 Описание надстройки для этой страны или региона.
Тег No 0 или 1 Пользовательские данные разработчика (также называемые тегами) для надстройки.
Ключевые слова No 0 или 1 Содержит до 10 элементов ключевых слов , содержащих ключевые слова для надстройки .
ImageUri No 0 или 1 Универсальный код ресурса (URI) для изображения в списке надстройки.

MarketData имеет следующие атрибуты.

Атрибут Обязательное поле Описание
xml:lang Да Указывает страну или регион, для которого применяются сведения о данных рынка.

Элемент LicenseInformation

Этот элемент описывает лицензии, доступные для этого приложения, и его устойчивые продукты в приложении. LicenseInformation является обязательным дочерним элементом элемента CurrentApp .

LicenseInformation содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
Приложение Да 1 Описывает лицензию приложения.
Продукт No 0 и более Описывает состояние лицензии устойчивой надстройки в приложении.

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

Условие для имитации IsActive IsTrial ExpirationDate
Полностью лицензировано true false Отсутствующий. На самом деле он может присутствовать и указывать будущую дату, но рекомендуется опустить элемент из XML-файла. Если он присутствует и указывает дату в прошлом, IsActive будет игнорироваться и приниматься в значение false.
В пробном периоде true true <Datetime в будущем> Этот элемент должен присутствовать, так как IsTrial имеет значение true. Вы можете посетить веб-сайт с текущим согласованным универсальным временем (UTC), чтобы узнать, насколько далеко в будущем установить этот период, чтобы получить оставшийся пробный период, который вы хотите.
Пробная версия с истекшим сроком действия false true <Дата и время в прошлом> элементе должно присутствовать, так как IsTrial имеет значение true. Вы можете посетить веб-сайт, показывающий текущее универсальное время в формате UTC, чтобы узнать, когда "прошлое" находится в формате UTC.
Недопустимо false false <любое значение или опущено>

Элемент App (дочерний элемент LicenseInformation)

Этот элемент описывает лицензию приложения. Приложение является обязательным дочерним элементом LicenseInformation .

Приложение содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
IsActive Да 1 Описывает текущее состояние лицензии этого приложения. Значение true указывает, что лицензия действительна; false указывает на недопустимую лицензию. Обычно это значение имеет значение true, имеет ли приложение пробный режим или нет. Задайте для этого значения значение false , чтобы проверить, как работает ваше приложение, если у него есть недопустимая лицензия.
IsTrial Да 1 Описывает текущее состояние пробной версии этого приложения. Значение true указывает, что приложение используется в течение пробного периода; False указывает, что приложение не находится в пробной версии, либо из-за того, что приложение было приобретено или срок пробной версии истек.
ExpirationDate No 0 или 1 Срок действия пробной версии для этого приложения истекает в формате UTC. Дата должна быть выражена следующим образом: гггг-мм-ддThh:mm:ss.ssZ. Например, 05:00 19 января 2015 г. будет указано как 2015-01-19T05:00:00.00Z. Этот элемент требуется, если isTrial имеет значение true. В противном случае это не обязательно.

Элемент Product (дочерний элемент LicenseInformation)

Этот элемент описывает состояние лицензии устойчивой надстройки в приложении. Продукт является необязательным дочерним элементом LicenseInformation .

Продукт содержит следующие дочерние элементы.

Элемент Обязательное поле Количество Description
IsActive Да 1 Описывает текущее состояние лицензии этой надстройки. Значение true указывает, что надстройка может использоваться; False указывает, что надстройка не может использоваться или не была приобретена
ExpirationDate No 0 или 1 Дата истечения срока действия надстройки в формате UTC. Дата должна быть выражена следующим образом: гггг-мм-ддThh:mm:ss.ssZ. Например, 05:00 19 января 2015 г. будет указано как 2015-01-19T05:00:00.00Z. Если этот элемент присутствует, надстройка имеет дату окончания срока действия. Если он отсутствует, надстройка не истекает.

Продукт имеет следующие атрибуты.

Атрибут Обязательное поле Описание
ProductId Да Содержит строку, используемую приложением для идентификации надстройки.
OfferId No Содержит строку, используемую приложением для идентификации категории, в которой принадлежит надстройка. Это обеспечивает поддержку каталогов больших элементов, как описано в разделе "Управление большим каталогом продуктов в приложении".

Элемент Имитации

Этот элемент описывает, как вызовы различных методов CurrentAppSimulator будут работать в приложении во время тестирования. Имитация является необязательным дочерним элементом Элемента CurrentApp и содержит ноль или более элементов DefaultResponse .

Имитация имеет следующие атрибуты.

Атрибут Обязательное поле Описание
SimulationMode No Значения могут быть интерактивными или автоматическими. Если для этого атрибута задано значение Automatic, методы автоматически возвращают указанные коды ошибок HRESULT. Это можно использовать при выполнении автоматических тестовых случаев.

Элемент DefaultResponse

Этот элемент описывает код ошибки по умолчанию, возвращаемый методом CurrentAppSimulator . DefaultResponse является необязательным дочерним элементом элемента Simulation .

DefaultResponse имеет следующие атрибуты.

Атрибут Обязательное поле Описание
MethodName Да Назначьте этот атрибут одному из значений перечисления, отображаемых для типа StoreMethodName в схеме. Каждое из этих значений перечисления представляет метод CurrentAppSimulator , для которого вы хотите имитировать возвращаемое значение кода ошибки в приложении во время тестирования. Например, значение RequestAppPurchaseAsync_GetResult указывает, что необходимо имитировать возвращаемое значение кода ошибки метода RequestAppPurchaseAsync.
HResult Да Назначьте этот атрибут одному из значений перечисления, отображаемым для типа ResponseCodes в схеме. Каждое из этих значений перечисления представляет код ошибки, который вы хотите вернуть для метода, назначенного атрибуту MethodName для этого элемента DefaultResponse .

Элемент ConsumableInformation

Этот элемент описывает потребляемые надстройки, доступные для этого приложения. ConsumableInformation является необязательным дочерним элементом элемента CurrentApp , и он может содержать ноль или несколько элементов Product .

Элемент Product (дочерний элемент ConsumableInformation)

Этот элемент описывает потребляемую надстройку. Продукт является необязательным дочерним элементом элемента ConsumableInformation .

Продукт имеет следующие атрибуты.

Атрибут Обязательное поле Описание
ProductId Да Содержит строку, используемую приложением для идентификации потребляемой надстройки.
TransactionId Да Содержит GUID (в виде строки), используемый приложением для отслеживания транзакции покупки потребляемого через процесс выполнения. Ознакомьтесь с разделом "Включение потребляемых покупок в приложении".
Состояние Да Содержит строку, используемую приложением для указания состояния выполнения потребляемого объекта. Значения могут быть активными, PurchaseReverted, PurchasePending или ServerError.
OfferId No Содержит строку, используемую приложением для идентификации категории, в которой принадлежит потребляемый объект. Это обеспечивает поддержку каталогов больших элементов, как описано в разделе "Управление большим каталогом продуктов в приложении".