Compras desde la aplicación y pruebas con el espacio de nombres Windows.ApplicationModel.Store
Puedes usar miembros en el espacio de nombres de Windows.ApplicationModel.Store para agregar compras en la aplicación y funcionalidad de prueba a tu aplicación de Plataforma universal de Windows (UWP) para ayudar a monetizar tu aplicación. Estas API también proporcionan acceso a la información de licencia de la aplicación.
En los artículos de esta sección se proporcionan instrucciones detalladas y ejemplos de código para usar los miembros del espacio de nombres Windows.ApplicationModel.Store para varios escenarios comunes. Para obtener información general sobre los conceptos básicos relacionados con las compras desde la aplicación en aplicaciones para UWP, consulta Compras y pruebas desde la aplicación. Para obtener un ejemplo completo que muestra cómo implementar pruebas y compras desde la aplicación mediante el espacio de nombres Windows.ApplicationModel.Store, consulta el ejemplo de la Tienda.
Importante
El espacio de nombres Windows.ApplicationModel.Store ya no se actualiza con nuevas características. Si el proyecto tiene como destino Windows 10 Anniversary Edition (10.0; Compilación 14393) o una versión posterior en Visual Studio (es decir, tiene como destino Windows 10, versión 1607 o posterior), se recomienda usar el espacio de nombres Windows.Services.Store en su lugar. Para obtener más información, consulte Pruebas y compras desde la aplicación. El espacio de nombres Windows.ApplicationModel.Store no se admite en las aplicaciones de escritorio de Windows que usan el Puente de dispositivo de escritorio o en aplicaciones o juegos que usan un espacio aislado de desarrollo en el Centro de partners (por ejemplo, este es el caso de cualquier juego que se integre con Xbox Live). Estos productos deben usar el espacio de nombres Windows.Services.Store para implementar las compras y pruebas desde la aplicación.
Introducción a las clases CurrentApp y CurrentAppSimulator
El punto de entrada principal del espacio de nombres Windows.ApplicationModel.Store es la clase CurrentApp . Esta clase proporciona propiedades y métodos estáticos que puedes usar para obtener información de la aplicación actual y sus complementos disponibles, obtener información de licencia para la aplicación actual o sus complementos, comprar una aplicación o complemento para el usuario actual y realizar otras tareas.
La clase CurrentApp obtiene sus datos de Microsoft Store, por lo que debes tener una cuenta de desarrollador y la aplicación debe publicarse en la Tienda para poder usar correctamente esta clase en la aplicación. Antes de enviar la aplicación a la Tienda, puedes probar el código con una versión simulada de esta clase denominada CurrentAppSimulator. Después de probar la aplicación y antes de enviarla a Microsoft Store, debes reemplazar las instancias de CurrentAppSimulator por CurrentAppApp. La aplicación producirá un error en la certificación si usa CurrentAppSimulator.
Cuando se usa CurrentAppSimulator, el estado inicial de las licencias y los productos en la aplicación se describe en un archivo local en el equipo de desarrollo denominado WindowsStoreProxy.xml. Para obtener más información sobre este archivo, vea Uso del archivo WindowsStoreProxy.xml con CurrentAppSimulator.
Para obtener más información sobre las tareas comunes que puede realizar con CurrentApp y CurrentAppSimulator, consulte los artículos siguientes.
Tema | Descripción |
---|---|
Exclusión o limitación de características en una versión de prueba | Si permites que los clientes usen la aplicación de forma gratuita durante un período de prueba, puedes pedir a los clientes que actualicen a la versión completa de la aplicación excluyendo o limitando algunas características durante el período de prueba. |
Habilitación de compras de productos en la aplicación | Tanto si la aplicación es gratuita como si no, puedes vender contenido, otras aplicaciones o nuevas funcionalidades de la aplicación (como desbloquear el siguiente nivel de un juego) desde la aplicación. Aquí te mostramos cómo habilitar estos productos en tu aplicación. |
Habilitación de compras de productos consumibles en la aplicación | Ofrecer productos consumibles desde la aplicación (artículos que se pueden comprar, usar y comprar de nuevo) a través de la plataforma comercial store para proporcionar a los clientes una experiencia de compra sólida y confiable. Esto es especialmente útil para cosas como la moneda en el juego (oro, monedas, etcetera.) que se pueden comprar y luego usar para comprar potenciaciones específicas. |
Administrar un catálogo grande de productos dentro de la aplicación | Si la aplicación ofrece un catálogo de productos grande en la aplicación, puede seguir opcionalmente el proceso descrito en este tema para ayudar a administrar el catálogo. |
Usar recibos para comprobar las compras de productos | Cada transacción de Microsoft Store que da como resultado una compra correcta del producto puede devolver opcionalmente un recibo de transacción que proporcione información sobre el producto enumerado y el costo monetario al cliente. Tener acceso a esta información admite escenarios en los que la aplicación necesita comprobar que un usuario compró la aplicación o ha realizado compras de productos desde la Microsoft Store. |
Uso del archivo WindowsStoreProxy.xml con CurrentAppSimulator
Cuando se usa CurrentAppSimulator, el estado inicial de las licencias y los productos en la aplicación se describe en un archivo local en el equipo de desarrollo denominado WindowsStoreProxy.xml. Los métodos CurrentAppSimulator que modifican el estado de la aplicación, por ejemplo, comprando una licencia o controlando una compra desde la aplicación, solo actualizan el estado del objeto CurrentAppSimulator en memoria. No se cambia el contenido de WindowsStoreProxy.xml. Cuando la aplicación se inicia de nuevo, el estado de la licencia vuelve a lo que se describe en WindowsStoreProxy.xml.
De forma predeterminada, se crea un archivo WindowsStoreProxy.xml en la siguiente ubicación: %UserProfile%\AppData\Local\Packages\<app package folder>\LocalState\Microsoft\Windows Store\ApiData. Puede editar este archivo para definir el escenario que desea simular en las propiedades CurrentAppSimulator .
Aunque puede modificar los valores de este archivo, se recomienda crear su propio archivo WindowsStoreProxy.xml (en una carpeta de datos del proyecto de Visual Studio) para que CurrentAppSimulator lo use en su lugar. Al simular la transacción, llame a ReloadSimulatorAsync para cargar el archivo. Si no llama a ReloadSimulatorAsync para cargar su propio archivo de WindowsStoreProxy.xml, CurrentAppSimulator creará o cargará (pero no sobrescribirá) el archivo de WindowsStoreProxy.xml predeterminado.
Nota:
Tenga en cuenta que CurrentAppSimulator no se inicializa completamente hasta que se complete ReloadSimulatorAsync. Y, dado que ReloadSimulatorAsync es un método asincrónico, se debe tener cuidado para evitar la condición de carrera de consultar CurrentAppSimulator en un subproceso mientras se inicializa en otro. Una técnica consiste en usar una marca para indicar que la inicialización está completa. Una aplicación instalada desde Microsoft Store debe usar CurrentApp en lugar de CurrentAppSimulator y, en ese caso , no se llama a ReloadSimulatorAsync y, por tanto, no se aplica la condición de carrera mencionada. Por este motivo, diseñe el código para que funcione en ambos casos, tanto de forma asincrónica como sincrónica.
Ejemplos
Este ejemplo es un archivo WindowsStoreProxy.xml (codificado con UTF-16) que describe una aplicación con un modo de prueba que expira a las 05:00 (UTC) el 19 de enero de 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>
El ejemplo siguiente es un archivo WindowsStoreProxy.xml (codificado con UTF-16) que describe una aplicación que se ha comprado, tiene una característica que expira a las 05:00 (UTC) el 19 de enero de 2015 y tiene una compra in-app consumible.
<?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>
Esquema
En esta sección se muestra el archivo XSD que define la estructura del archivo WindowsStoreProxy.xml. Para aplicar este esquema al editor XML de Visual Studio al trabajar con el archivo WindowsStoreProxy.xml, haga lo siguiente:
- Abra el archivo WindowsStoreProxy.xml en Visual Studio.
- En el menú XML , haga clic en Crear esquema. Esto creará un archivo WindowsStoreProxy.xsd temporal basado en el contenido del archivo XML.
- Reemplace el contenido de ese archivo .xsd por el esquema siguiente.
- Guarde el archivo en una ubicación donde pueda aplicarlo a varios proyectos de aplicación.
- Cambie al archivo WindowsStoreProxy.xml en Visual Studio.
- En el menú XML , haga clic en Esquemas y busque la fila de la lista para el archivo WindowsStoreProxy.xsd. Si la ubicación del archivo no es la que desea (por ejemplo, si todavía se muestra el archivo temporal), haga clic en Agregar. Vaya al archivo derecho y haga clic en Aceptar. Ahora debería ver ese archivo en la lista. Asegúrese de que aparece una marca de verificación en la columna Usar para ese esquema.
Una vez hecho esto, las modificaciones que realice para WindowsStoreProxy.xml estarán sujetas al esquema. Para obtener más información, vea Cómo: Seleccionar los esquemas XML que se van a usar.
<?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>
Descripciones de elementos y atributos
En esta sección se describen los elementos y atributos del archivo WindowsStoreProxy.xml.
El elemento raíz de este archivo es el elemento CurrentApp , que representa la aplicación actual. Este elemento contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
ListingInformation | Sí | 1 | Contiene datos de la lista de la aplicación. |
LicenseInformation | Sí | 1 | Describe las licencias disponibles para esta aplicación y sus complementos duraderos. |
ConsumableInformation | No | 0 o 1 | Describe los complementos consumibles que están disponibles para esta aplicación. |
Simulación | No | 0 o 1 | Describe cómo funcionarán las llamadas a varios métodos CurrentAppSimulator en la aplicación durante las pruebas. |
Elemento ListingInformation
Este elemento contiene datos de la lista de la aplicación. ListingInformation es un elemento secundario necesario del elemento CurrentApp .
ListingInformation contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
Aplicación | Sí | 1 | Proporciona datos sobre la aplicación. |
Identificador | No | 0 o más | Describe un complemento para la aplicación. |
Elemento App (elemento secundario de ListingInformation)
Este elemento describe la licencia de la aplicación. La aplicación es un elemento secundario obligatorio del elemento ListingInformation .
La aplicación contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
AppId | Sí | 1 | GUID que identifica la aplicación en la Tienda. Puede ser cualquier GUID para las pruebas. |
LinkUri | Sí | 1 | URI de la página de descripción en la tienda. Puede ser cualquier URI válido para las pruebas. |
CurrentMarket | Sí | 1 | País o región del cliente. |
AgeRating | Sí | 1 | Entero que representa la clasificación mínima de edad de la aplicación. Este es el mismo valor que especificaría en el Centro de partners al enviar la aplicación. Los valores usados por store son: 3, 7, 12 y 16. Para obtener más información sobre estas clasificaciones, consulta Clasificación por edades. |
MarketData | Sí | 1 o más | Contiene información sobre la aplicación para un país o región determinado. Para cada país o región en el que se muestra la aplicación, debe incluir un elemento MarketData . |
Elemento MarketData (elemento secundario de App)
Este elemento proporciona información sobre la aplicación para un país o región determinado. Para cada país o región en el que se muestra la aplicación, debe incluir un elemento MarketData . MarketData es un elemento secundario necesario del elemento App .
MarketData contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
Nombre | Sí | 1 | Nombre de la aplicación en este país o región. |
Descripción | Sí | 1 | Descripción de la aplicación para este país o región. |
Precio | Sí | 1 | El precio de la aplicación en este país o región. |
CurrencySymbol | Sí | 1 | Símbolo de moneda usado en este país o región. |
CurrencyCode | No | 0 o 1 | El código de moneda usado en este país o región. |
MarketData tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
xml:lang | Sí | Especifica el país o región para el que se aplica la información de datos del mercado. |
Elemento Product (elemento secundario de ListingInformation)
Este elemento describe un complemento para la aplicación. Product es un elemento secundario opcional del elemento ListingInformation y contiene uno o varios elementos MarketData .
Product tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
ProductId | Sí | Contiene la cadena usada por la aplicación para identificar el complemento. |
LicenseDuration | No | Indica el número de días durante los que la licencia será válida una vez adquirido el artículo. La fecha de expiración de la nueva licencia creada por una compra de producto es la fecha de compra más la duración de la licencia. Este atributo solo se usa si el atributo ProductType es Durable; este atributo se omite para complementos consumibles. |
ProductType | No | Contiene un valor para identificar la persistencia del producto en la aplicación. Los valores admitidos son Durable (el valor predeterminado) y Consumable. Para los tipos duraderos, una información adicional se describe mediante un elemento Product en LicenseInformation; para los tipos consumibles, se describe información adicional mediante un elemento Product en ConsumableInformation. |
Elemento MarketData (elemento secundario de Product)
Este elemento proporciona información sobre el complemento para un país o región determinados. Para cada país o región en el que aparece el complemento, debe incluir un elemento MarketData . MarketData es un elemento secundario necesario del elemento Product .
MarketData contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
Nombre | Sí | 1 | Nombre del complemento en este país o región. |
Precio | Sí | 1 | El precio del complemento en este país o región. |
CurrencySymbol | Sí | 1 | Símbolo de moneda usado en este país o región. |
CurrencyCode | No | 0 o 1 | El código de moneda usado en este país o región. |
Descripción | No | 0 o 1 | Descripción del complemento para este país o región. |
Tag | No | 0 o 1 | Los datos de desarrollador personalizados (también denominados etiquetas) para el complemento. |
Palabras clave | No | 0 o 1 | Contiene hasta 10 elementos de palabra clave que contienen las palabras clave del complemento. |
ImageUri | No | 0 o 1 | Identificador URI de la imagen en la lista del complemento. |
MarketData tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
xml:lang | Sí | Especifica el país o región para el que se aplica la información de datos del mercado. |
Elemento LicenseInformation
En este elemento se describen las licencias disponibles para esta aplicación y sus productos duraderos en la aplicación. LicenseInformation es un elemento secundario necesario del elemento CurrentApp .
LicenseInformation contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
Aplicación | Sí | 1 | Describe la licencia de la aplicación. |
Identificador | No | 0 o más | Describe el estado de licencia de un complemento duradero en la aplicación. |
En la tabla siguiente se muestra cómo simular algunas condiciones comunes mediante la combinación de valores en los elementos App y Product .
Condición para simular | IsActive | IsTrial | ExpirationDate |
---|---|---|---|
Licencia completa | true | false | Ausente. En realidad, puede estar presente y especificar una fecha futura, pero se recomienda omitir el elemento del archivo XML. Si está presente y especifica una fecha en el pasado, IsActive se omitirá y se tomará como false. |
En el período de prueba | true | true | <una fecha y hora en el futuro> Este elemento debe estar presente porque IsTrial es true. Puede visitar un sitio web que muestre la hora universal coordinada (UTC) actual para saber hasta qué punto en el futuro establecer esto para obtener el período de prueba restante que desee. |
Prueba expirada | false | true | <datetime en el pasado> Este elemento debe estar presente porque IsTrial es true. Puede visitar un sitio web que muestra la hora universal coordinada actual (UTC) para saber cuándo "el pasado" está en UTC. |
No válida | false | false | <cualquier valor o se omite> |
Elemento App (elemento secundario de LicenseInformation)
Este elemento describe la licencia de la aplicación. La aplicación es un elemento secundario obligatorio del elemento LicenseInformation .
La aplicación contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
IsActive | Sí | 1 | Describe el estado de licencia actual de esta aplicación. El valor true indica que la licencia es válida; false indica una licencia no válida. Normalmente, este valor es true, tanto si la aplicación tiene un modo de prueba como si no. Establezca este valor en false para probar cómo se comporta la aplicación cuando tiene una licencia no válida. |
IsTrial | Sí | 1 | Describe el estado de prueba actual de esta aplicación. El valor true indica que la aplicación se está usando durante el período de prueba; false indica que la aplicación no está en una versión de prueba, ya sea porque la aplicación se ha comprado o el período de prueba ha expirado. |
ExpirationDate | No | 0 o 1 | La fecha en que expira el período de prueba de esta aplicación, en Hora universal coordinada (UTC). La fecha debe expresarse como: aaaa-mm-ddThh:mm:ss.ssZ. Por ejemplo, 05:00 el 19 de enero de 2015 se especificaría como 2015-01-19T05:00:00.00Z. Este elemento es necesario cuando IsTrial es true. De lo contrario, no es necesario. |
Elemento Product (elemento secundario de LicenseInformation)
Este elemento describe el estado de licencia de un complemento duradero en la aplicación. Product es un elemento secundario opcional del elemento LicenseInformation .
Product contiene los siguientes elementos secundarios.
Elemento | Obligatorio | Quantity | Descripción |
---|---|---|---|
IsActive | Sí | 1 | Describe el estado de licencia actual de este complemento. El valor true indica que se puede usar el complemento; false indica que el complemento no se puede usar o no se ha comprado. |
ExpirationDate | No | 0 o 1 | La fecha en que expira el complemento, en hora universal coordinada (UTC). La fecha debe expresarse como: aaaa-mm-ddThh:mm:ss.ssZ. Por ejemplo, 05:00 el 19 de enero de 2015 se especificaría como 2015-01-19T05:00:00.00Z. Si este elemento está presente, el complemento tiene una fecha de expiración. Si no está presente, el complemento no expira. |
Product tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
ProductId | Sí | Contiene la cadena usada por la aplicación para identificar el complemento. |
OfferId | No | Contiene la cadena usada por la aplicación para identificar la categoría en la que pertenece el complemento. Esto proporciona compatibilidad con catálogos de elementos grandes, como se describe en Administración de un catálogo grande de productos en la aplicación. |
Elemento Simulation
En este elemento se describe cómo funcionarán las llamadas a varios métodos CurrentAppSimulator en la aplicación durante las pruebas. La simulación es un elemento secundario opcional del elemento CurrentApp y contiene cero o más elementos DefaultResponse .
La simulación tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
SimulationMode | No | Los valores pueden ser interactivos o automáticos. Cuando este atributo se establece en Automático, los métodos devolverán automáticamente los códigos de error HRESULT especificados. Esto se puede usar al ejecutar casos de prueba automatizados. |
Elemento DefaultResponse
Este elemento describe el código de error predeterminado devuelto por un método CurrentAppSimulator . DefaultResponse es un elemento secundario opcional del elemento Simulation .
DefaultResponse tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
MethodName | Sí | Asigne este atributo a uno de los valores de enumeración que se muestran para el tipo StoreMethodName en el esquema. Cada uno de estos valores de enumeración representa un método CurrentAppSimulator para el que quiere simular un valor devuelto de código de error en la aplicación durante las pruebas. Por ejemplo, el valor RequestAppPurchaseAsync_GetResult indica que desea simular el valor devuelto del código de error del método RequestAppPurchaseAsync . |
HResult | Sí | Asigne este atributo a uno de los valores de enumeración que se muestran para el tipo ResponseCodes en el esquema. Cada uno de estos valores de enumeración representa el código de error que desea devolver para el método asignado al atributo MethodName para este elemento DefaultResponse . |
Elemento ConsumableInformation
Este elemento describe los complementos consumibles disponibles para esta aplicación. ConsumableInformation es un elemento secundario opcional del elemento CurrentApp y puede contener cero o más elementos Product .
Elemento Product (elemento secundario de ConsumableInformation)
Este elemento describe un complemento consumible. Product es un elemento secundario opcional del elemento ConsumableInformation .
Product tiene los siguientes atributos.
Atributo | Obligatorio | Descripción |
---|---|---|
ProductId | Sí | Contiene la cadena usada por la aplicación para identificar el complemento consumible. |
TransactionId | Sí | Contiene un GUID (como una cadena) usado por la aplicación para realizar un seguimiento de la transacción de compra de un consumible a través del proceso de cumplimiento. Consulte Habilitación de compras de productos consumibles desde la aplicación. |
Estado | Sí | Contiene la cadena usada por la aplicación para indicar el estado de cumplimiento de un consumible. Los valores pueden ser Active, PurchaseReverted, PurchasePending o ServerError. |
OfferId | No | Contiene la cadena usada por la aplicación para identificar la categoría a la que pertenece el consumible. Esto proporciona compatibilidad con catálogos de elementos grandes, como se describe en Administración de un catálogo grande de productos en la aplicación. |