Compartilhar via


Compras no aplicativo e avaliações usando o namespace Windows.ApplicationModel.Store

Você pode usar membros no namespace Windows.ApplicationModel.Store para adicionar compras no aplicativo e funcionalidade de avaliação ao seu aplicativo UWP (Plataforma Universal do Windows) para ajudar a monetizar seu aplicativo. Essas APIs também fornecem acesso às informações de licença do seu aplicativo.

Os artigos nesta seção fornecem diretrizes detalhadas e exemplos de código para usar os membros no namespace Windows.ApplicationModel.Store para vários cenários comuns. Para obter uma visão geral dos conceitos básicos relacionados a compras no aplicativo em aplicativos UWP, consulte Compras no aplicativo e avaliações. Para obter um exemplo completo que demonstra como implementar avaliações e compras no aplicativo usando o namespace Windows.ApplicationModel.Store, consulte o exemplo da Loja.

Importante

O namespace Windows.ApplicationModel.Store não está mais sendo atualizado com novos recursos. Se o seu projeto for direcionado ao Windows 10 Anniversary Edition (10.0; Build 14393) ou uma versão posterior no Visual Studio (ou seja, você está direcionando Windows 10, versão 1607 ou posterior), recomendamos que você use o namespace Windows.Services.Store . Para obter mais informações, confira Compras e avaliações no aplicativo. Não há suporte ao namespace Windows.ApplicationModel.Store em aplicativos da área de trabalho do Windows que usam a Ponte de Desktop ou em aplicativos ou jogos que usam uma área restrita de desenvolvimento no Partner Center (por exemplo, esse é o caso de qualquer jogo integrado ao Xbox Live). Esses produtos devem usar o namespace Windows.Services.Store para implementar compras e avaliações no aplicativo.

Introdução às classes CurrentApp e CurrentAppSimulator

O principal ponto de entrada para o namespace Windows.ApplicationModel.Store é a classe CurrentApp . Essa classe fornece propriedades estáticas e métodos que você pode usar para obter informações para o aplicativo atual e seus complementos disponíveis, obter informações de licença para o aplicativo atual ou seus complementos, comprar um aplicativo ou complemento para o usuário atual e executar outras tarefas.

A classe CurrentApp obtém seus dados da Microsoft Store, portanto, você deve ter uma conta de desenvolvedor e o aplicativo deve ser publicado na Loja antes que você possa usar essa classe com êxito em seu aplicativo. Antes de enviar seu aplicativo para a Loja, você pode testar seu código com uma versão simulada dessa classe chamada CurrentAppSimulator. Depois de testar seu aplicativo e antes de enviá-lo para a Microsoft Store, você deve substituir as instâncias de CurrentAppSimulator por CurrentApp. Seu aplicativo falhará na certificação se usar CurrentAppSimulator.

Quando o CurrentAppSimulator é usado, o estado inicial do licenciamento e dos produtos no aplicativo do aplicativo é descrito em um arquivo local no computador de desenvolvimento chamado WindowsStoreProxy.xml. Para obter mais informações sobre esse arquivo, consulte Usando o arquivo WindowsStoreProxy.xml com CurrentAppSimulator.

Para obter mais informações sobre tarefas comuns que você pode executar usando CurrentApp e CurrentAppSimulator, consulte os artigos a seguir.

Tópico Descrição
Excluir ou limitar recursos em uma versão de avaliação Se você permitir que os clientes usem seu aplicativo gratuitamente durante um período de avaliação, poderá incentivá-los a atualizar para a versão completa do seu aplicativo excluindo ou limitando alguns recursos durante o período de avaliação.
Habilitar compras de produtos no aplicativo Independentemente de seu aplicativo ser gratuito ou não, você pode vender conteúdo, outros aplicativos ou novas funcionalidades do aplicativo (como desbloquear o próximo nível de um jogo) diretamente no aplicativo. Aqui, mostramos como habilitar esses produtos em seu aplicativo.
Habilitar compras de produtos consumíveis no aplicativo Ofereça produtos consumíveis no aplicativo (itens que podem ser comprados, usados e comprados novamente) por meio da plataforma de comércio da Store para fornecer aos seus clientes uma experiência de compra robusta e confiável. Isso é especialmente útil para coisas como moeda do jogo (ouro, moedas, etc.) que podem ser compradas e usadas para comprar power-ups específicos.
Gerenciar um grande catálogo de produtos no aplicativo Se seu aplicativo oferece um grande catálogo de produtos no aplicativo, você pode, opcionalmente, seguir o processo descrito neste tópico para ajudar a gerenciar seu catálogo.
Usar recibos para verificar compras de produtos Cada transação da Microsoft Store que resulta em uma compra de produto bem-sucedida pode, opcionalmente, retornar um recibo de transação que fornece informações sobre o produto listado e o custo monetário para o cliente. Ter acesso a essas informações dá suporte a cenários em que seu aplicativo precisa verificar se um usuário comprou seu aplicativo ou fez compras de produtos no aplicativo na Microsoft Store.

Usando o arquivo WindowsStoreProxy.xml com CurrentAppSimulator

Quando o CurrentAppSimulator é usado, o estado inicial do licenciamento e dos produtos no aplicativo do aplicativo é descrito em um arquivo local no computador de desenvolvimento chamado WindowsStoreProxy.xml. Os métodos CurrentAppSimulator que alteram o estado do aplicativo, por exemplo, comprando uma licença ou manipulando uma compra no aplicativo, apenas atualizam o estado do objeto CurrentAppSimulator na memória. O conteúdo de WindowsStoreProxy.xml não é alterado. Quando o aplicativo é iniciado novamente, o estado da licença é revertido para o que está descrito em WindowsStoreProxy.xml.

Um arquivo WindowsStoreProxy.xml é criado por padrão no seguinte local: %UserProfile%\AppData\Local\Packages\<app package folder>\LocalState\Microsoft\Windows Store\ApiData. Você pode editar esse arquivo para definir o cenário que deseja simular nas propriedades CurrentAppSimulator.

Embora você possa modificar os valores nesse arquivo, recomendamos que você crie seu próprio arquivo WindowsStoreProxy.xml (em uma pasta de dados do seu projeto do Visual Studio) para CurrentAppSimulator usar. Ao simular a transação, chame ReloadSimulatorAsync para carregar o arquivo. Se você não chamar ReloadSimulatorAsync para carregar seu próprio arquivo WindowsStoreProxy.xml, o CurrentAppSimulator criará/carregará (mas não substituirá) o arquivo WindowsStoreProxy.xml padrão.

Observação

Lembre-se de que o CurrentAppSimulator não é totalmente inicializado até que ReloadSimulatorAsync seja concluído. E, como ReloadSimulatorAsync é um método assíncrono, deve-se tomar cuidado para evitar a condição de corrida de consultar CurrentAppSimulator em um thread enquanto ele está sendo inicializado em outro. Uma técnica é usar um sinalizador para indicar que a inicialização foi concluída. Um aplicativo instalado da Microsoft Store deve usar CurrentApp em vez de CurrentAppSimulator e, nesse caso , ReloadSimulatorAsync não é chamado e, portanto, a condição de corrida mencionada não se aplica. Por esse motivo, projete seu código para que ele funcione em ambos os casos, de forma assíncrona e síncrona.

Exemplos

Este exemplo é um arquivo WindowsStoreProxy.xml (codificado em UTF-16) que descreve um aplicativo com um modo de avaliação que expira às 05:00 (UTC) de 19 de janeiro de 2015.

<?xml version="1.0" encoding="UTF-16"?>
<CurrentApp>
  <ListingInformation>
    <App>
      <AppId>00001111-aaaa-2222-bbbb-3333cccc4444</AppId>
      <LinkUri>http://apps.windows.microsoft.com/app/00001111-aaaa-2222-bbbb-3333cccc4444</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>

O próximo exemplo é um arquivo WindowsStoreProxy.xml (codificado em UTF-16) que descreve um aplicativo que foi comprado, tem um recurso que expira às 05:00 (UTC) em 19 de janeiro de 2015 e tem uma compra consumível no aplicativo.

<?xml version="1.0" encoding="utf-16" ?>
<CurrentApp>
  <ListingInformation>
    <App>
      <AppId>11112222-bbbb-3333-cccc-4444dddd5555</AppId>
      <LinkUri>http://apps.windows.microsoft.com/app/11112222-bbbb-3333-cccc-4444dddd5555</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>

Esquema

Esta seção lista o arquivo XSD que define a estrutura do arquivo WindowsStoreProxy.xml. Para aplicar esse esquema ao editor XML no Visual Studio ao trabalhar com o arquivo WindowsStoreProxy.xml, faça o seguinte:

  1. Abra o arquivo WindowsStoreProxy.xml no Visual Studio.
  2. No menu XML , clique em Criar esquema. Isso criará um arquivo temporário WindowsStoreProxy.xsd com base no conteúdo do arquivo XML.
  3. Substitua o conteúdo desse arquivo .xsd pelo esquema abaixo.
  4. Salve o arquivo em um local onde você possa aplicá-lo a vários projetos de aplicativos.
  5. Alterne para o arquivo WindowsStoreProxy.xml no Visual Studio.
  6. No menu XML , clique em Esquemas e localize a linha na lista do arquivo WindowsStoreProxy.xsd. Se o local do arquivo não for o desejado (por exemplo, se o arquivo temporário ainda for exibido), clique em Adicionar. Navegue até o arquivo correto e clique em OK. Agora você deve ver esse arquivo na lista. Certifique-se de que uma marca de seleção apareça na coluna Usar para esse esquema.

Depois de fazer isso, as edições feitas em WindowsStoreProxy.xml estarão sujeitas ao esquema. Para obter mais informações, consulte Como selecionar os esquemas XML a serem usados.

<?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>

Descrições de elementos e atributos

Esta seção descreve os elementos e atributos no arquivo WindowsStoreProxy.xml.

O elemento raiz desse arquivo é o elemento CurrentApp , que representa o aplicativo atual. Esse elemento contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
Informações da listagem Sim 1 Contém dados da listagem do aplicativo.
Informações de licença Sim 1 Descreve as licenças disponíveis para este aplicativo e seus complementos duráveis.
Informações sobre consumíveis Não 0 ou 1 Descreve os complementos consumíveis disponíveis para este aplicativo.
Simulação Não 0 ou 1 Descreve como as chamadas para vários métodos CurrentAppSimulator funcionarão no aplicativo durante o teste.

Elemento ListingInformation

Esse elemento contém dados da listagem do aplicativo. ListingInformation é um filho obrigatório do elemento CurrentApp .

ListingInformation contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
Aplicativo Sim 1 Fornece dados sobre o aplicativo.
Product Não 0 ou mais Descreve um complemento para o aplicativo.

App (filho de ListingInformation)

Esse elemento descreve a licença do aplicativo. App é um filho necessário do elemento ListingInformation .

App contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
AppId Sim 1 O GUID que identifica o aplicativo na Loja. Pode ser qualquer GUID para teste.
LinkUri Sim 1 O URI da página de listagem na loja. Pode ser qualquer URI válido para teste.
Mercado atual Sim 1 O país/região do cliente.
Classificação etária Sim 1 Um número inteiro que representa a classificação etária mínima do aplicativo. Esse é o mesmo valor que você especificaria no Partner Center ao enviar o aplicativo. Os valores usados pela Loja são: 3, 7, 12 e 16. Para obter mais informações sobre essas classificações, consulte Classificações etárias.
Dados de mercado Sim 1 ou mais Contém informações sobre o aplicativo para um determinado país/região. Para cada país/região em que o aplicativo está listado, você deve incluir um elemento MarketData .

Elemento MarketData (filho do aplicativo)

Esse elemento fornece informações sobre o aplicativo para um determinado país/região. Para cada país/região em que o aplicativo está listado, você deve incluir um elemento MarketData . MarketData é um filho obrigatório do elemento App .

MarketData contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
Nome Sim 1 O nome do aplicativo neste país/região.
Descrição Sim 1 A descrição do aplicativo para este país/região.
Price Sim 1 O preço do aplicativo neste país/região.
CurrencySymbol Sim 1 O símbolo de moeda usado neste país/região.
Código de moeda Não 0 ou 1 O código da moeda usada neste país/região.

MarketData tem os seguintes atributos.

Atributo Obrigatório Descrição
xml:lang Sim Especifica o país/região ao qual as informações de dados de mercado se aplicam.

Product (filho de ListingInformation)

Esse elemento descreve um complemento para o aplicativo. Product é um filho opcional do elemento ListingInformation e contém um ou mais elementos MarketData .

Product tem os seguintes atributos.

Atributo Obrigatório Descrição
ProductId Sim Contém a cadeia de caracteres usada pelo aplicativo para identificar o complemento.
Duração da licença Não Indica o número de dias pelos quais a licença será válida após a compra do item. A data de expiração da nova licença criada pela compra de um produto é a data de compra mais a duração da licença. Esse atributo será usado somente se o atributo ProductType for Durable; esse atributo será ignorado para complementos consumíveis.
ProductType Não Contém um valor para identificar a persistência do produto no aplicativo. Os valores com suporte são Durável (o padrão) e Consumível. Para tipos duráveis, as informações adicionais são descritas por um elemento Product em LicenseInformation; para tipos consumíveis, as informações adicionais são descritas por um elemento Product em ConsumableInformation.

Elemento MarketData (filho do Produto)

Esse elemento fornece informações sobre o complemento para um determinado país/região. Para cada país/região em que o complemento está listado, você deve incluir um elemento MarketData . MarketData é um filho obrigatório do elemento Product .

MarketData contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
Nome Sim 1 O nome do complemento neste país/região.
Price Sim 1 O preço do complemento neste país/região.
CurrencySymbol Sim 1 O símbolo de moeda usado neste país/região.
Código de moeda Não 0 ou 1 O código da moeda usada neste país/região.
Descrição Não 0 ou 1 A descrição do complemento para este país/região.
Marca Não 0 ou 1 Os dados personalizados do desenvolvedor (também chamados de tag) para o complemento.
Palavras-chave Não 0 ou 1 Contém até 10 elementos de palavra-chave que contêm as palavras-chave do complemento.
ImageUri Não 0 ou 1 O URI da imagem na listagem do complemento.

MarketData tem os seguintes atributos.

Atributo Obrigatório Descrição
xml:lang Sim Especifica o país/região ao qual as informações de dados de mercado se aplicam.

Elemento LicenseInformation

Esse elemento descreve as licenças disponíveis para este aplicativo e seus produtos duráveis no aplicativo. LicenseInformation é um filho obrigatório do elemento CurrentApp .

LicenseInformation contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
Aplicativo Sim 1 Descreve a licença do aplicativo.
Product Não 0 ou mais Descreve o status da licença de um complemento durável no aplicativo.

A tabela a seguir mostra como simular algumas condições comuns combinando valores nos elementos App e Product .

Condição a simular IsActive IsTrial ExpirationDate
Totalmente licenciado true false Ausente. Na verdade, ele pode estar presente e especificar uma data futura, mas é recomendável omitir o elemento do arquivo XML. Se estiver presente e especificar uma data no passado, IsActive será ignorado e considerado falso.
No período de teste true true <uma data e hora no futuro> Esse elemento deve estar presente porque IsTrial é true. Você pode visitar um site que mostra o UTC (Tempo Universal Coordenado) atual para saber até que ponto no futuro defini-lo para obter o período de teste restante desejado.
Avaliação expirada false true <uma data e hora no passado> Esse elemento deve estar presente porque IsTrial é true. Você pode visitar um site que mostra o Tempo Universal Coordenado (UTC) atual para saber quando "o passado" está em UTC.
Inválido false false <qualquer valor ou omitido>

Elemento App (filho de LicenseInformation)

Esse elemento descreve a licença do aplicativo. App é um filho necessário do elemento LicenseInformation .

App contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
IsActive Sim 1 Descreve o estado atual da licença deste aplicativo. O valor true indica que a licença é válida; false indica uma licença inválida. Normalmente, esse valor é verdadeiro, independentemente de o aplicativo ter um modo de avaliação ou não. Defina esse valor como false para testar como seu aplicativo se comporta quando ele tem uma licença inválida.
ÉJulgamento Sim 1 Descreve o estado de avaliação atual deste aplicativo. O valor true indica que o aplicativo está sendo usado durante o período de avaliação; false indica que o aplicativo não está em uma avaliação, seja porque o aplicativo foi comprado ou o período de avaliação expirou.
ExpirationDate Não 0 ou 1 A data em que o período de avaliação deste aplicativo expira, em UTC (Tempo Universal Coordenado). A data deve ser expressa como: aaaa-mm-ddThh:mm:ss.ssZ. Por exemplo, 05:00 em 19 de janeiro de 2015 seria especificado como 2015-01-19T05:00:00.00Z. Esse elemento é necessário quando IsTrial é true. Caso contrário, não é necessário.

Elemento Product (filho de LicenseInformation)

Esse elemento descreve o status da licença de um complemento durável no aplicativo. Product é um filho opcional do elemento LicenseInformation .

O produto contém os seguintes elementos filho.

Elemento Obrigatório Quantidade Descrição
IsActive Sim 1 Descreve o estado atual da licença deste complemento. O valor true indica que o complemento pode ser usado; false indica que o complemento não pode ser usado ou não foi comprado
ExpirationDate Não 0 ou 1 A data em que o complemento expira, em UTC (Tempo Universal Coordenado). A data deve ser expressa como: aaaa-mm-ddThh:mm:ss.ssZ. Por exemplo, 05:00 em 19 de janeiro de 2015 seria especificado como 2015-01-19T05:00:00.00Z. Se esse elemento estiver presente, o complemento terá uma data de expiração. Se não estiver presente, o complemento não expirará.

Product tem os seguintes atributos.

Atributo Obrigatório Descrição
ProductId Sim Contém a cadeia de caracteres usada pelo aplicativo para identificar o complemento.
Oferta Não Contém a cadeia de caracteres usada pelo aplicativo para identificar a categoria à qual o complemento pertence. Isso fornece suporte para catálogos de itens grandes, conforme descrito em Gerenciar um grande catálogo de produtos no aplicativo.

Elemento de simulação

Esse elemento descreve como as chamadas para vários métodos CurrentAppSimulator funcionarão no aplicativo durante o teste. Simulation é um filho opcional do elemento CurrentApp e contém zero ou mais elementos DefaultResponse .

A simulação tem os seguintes atributos.

Atributo Obrigatório Descrição
Modo de simulação Não Os valores podem ser Interativos ou Automáticos. Quando esse atributo é definido como Automático, os métodos retornarão automaticamente os códigos de erro HRESULT especificados. Isso pode ser usado ao executar casos de teste automatizados.

Elemento DefaultResponse

Esse elemento descreve o código de erro padrão retornado por um método CurrentAppSimulator . DefaultResponse é um filho opcional do elemento Simulation .

DefaultResponse tem os seguintes atributos.

Atributo Obrigatório Descrição
MethodName Sim Atribua esse atributo a um dos valores de enumeração mostrados para o tipo StoreMethodName no esquema. Cada um desses valores de enumeração representa um método CurrentAppSimulator para o qual você deseja simular um valor de retorno de código de erro em seu aplicativo durante o teste. Por exemplo, o valor RequestAppPurchaseAsync_GetResult indica que você deseja simular o valor retornado do código de erro do método RequestAppPurchaseAsync .
Resultado Sim Atribua esse atributo a um dos valores de enumeração mostrados para o tipo ResponseCodes no esquema. Cada um desses valores de enumeração representa o código de erro que você deseja retornar para o método atribuído ao atributo MethodName para esse elemento DefaultResponse .

Elemento ConsumableInformation

Este elemento descreve os complementos consumíveis disponíveis para este aplicativo. ConsumableInformation é um filho opcional do elemento CurrentApp e pode conter zero ou mais elementos Product .

Elemento Product (filho de ConsumableInformation)

Esse elemento descreve um complemento consumível. Product é um filho opcional do elemento ConsumableInformation .

Product tem os seguintes atributos.

Atributo Obrigatório Descrição
ProductId Sim Contém a cadeia de caracteres usada pelo aplicativo para identificar o complemento consumível.
ID da transação Sim Contém um GUID (como uma cadeia de caracteres) usado pelo aplicativo para rastrear a transação de compra de um consumível por meio do processo de atendimento. Consulte Habilitar compras de produtos consumíveis no aplicativo.
Status Sim Contém a cadeia de caracteres usada pelo aplicativo para indicar o status de processamento de um consumível. Os valores podem ser Active, PurchaseReverted, PurchasePending ou ServerError.
Oferta Não Contém a cadeia de caracteres usada pelo aplicativo para identificar a categoria à qual o consumível pertence. Isso fornece suporte para catálogos de itens grandes, conforme descrito em Gerenciar um grande catálogo de produtos no aplicativo.