Partager via


Achats in-app et versions d’essai avec l’espace de noms Windows.ApplicationModel.Store

Vous pouvez utiliser des membres dans l’espace de noms Windows.ApplicationModel.Store pour ajouter des achats in-app et des fonctionnalités d’essai à votre application plateforme Windows universelle (UWP) pour faciliter la monétisation de votre application. Ces API fournissent également l’accès aux informations de licence pour votre application.

Les articles de cette section fournissent des conseils détaillés et des exemples de code pour l’utilisation des membres dans l’espace de noms Windows.ApplicationModel.Store pour plusieurs scénarios courants. Pour obtenir une vue d’ensemble des concepts de base liés aux achats in-app dans les applications UWP, consultez les achats et les versions d’évaluation dans l’application. Pour obtenir un exemple complet qui montre comment implémenter des essais et des achats dans l’application à l’aide de l’espace de noms Windows.ApplicationModel.Store, consultez l’exemple Store.

Important

L’espace de noms Windows.ApplicationModel.Store n’est plus mis à jour avec de nouvelles fonctionnalités. Si votre projet cible Windows 10 Édition anniversaire (10.0 ; Build 14393) ou version ultérieure dans Visual Studio (autrement dit, vous ciblez Windows 10, version 1607 ou ultérieure), nous vous recommandons d’utiliser l’espace de noms Windows.Services.Store à la place. Pour plus d’informations, consultez Achats in-app et versions d’évaluation. L’espace de noms Windows.ApplicationModel.Store n’est pas pris en charge dans les applications de bureau Windows qui utilisent le Pont du bureau ni dans les applications ou jeux qui utilisent un bac à sable de développement dans l’Espace partenaires (par exemple, c’est le cas pour tous les jeux qui s’intègrent à Xbox Live). Ces produits doivent utiliser l’espace de noms Windows.Services.Store pour implémenter des achats et des essais dans l’application.

Prise en main des classes CurrentApp et CurrentAppSimulator

Le point d’entrée principal de l’espace de noms Windows.ApplicationModel.Store est la classe CurrentApp . Cette classe fournit des propriétés et des méthodes statiques que vous pouvez utiliser pour obtenir des informations sur l’application actuelle et ses modules complémentaires disponibles, obtenir des informations de licence pour l’application actuelle ou ses modules complémentaires, acheter une application ou un module complémentaire pour l’utilisateur actuel et effectuer d’autres tâches.

La classe CurrentApp obtient ses données à partir du Microsoft Store. Vous devez donc disposer d’un compte de développeur et l’application doit être publiée dans le Store avant de pouvoir utiliser cette classe dans votre application. Avant de soumettre votre application au Windows Store, vous pouvez tester votre code avec une version simulée de cette classe appelée CurrentAppSimulator. Après avoir testé votre application et avant de l’envoyer au Microsoft Store, vous devez remplacer les instances de CurrentAppSimulator par CurrentApp. Votre application échouera la certification si elle utilise CurrentAppSimulator.

Lorsque CurrentAppSimulator est utilisé, l’état initial des licences et produits in-app de votre application est décrit dans un fichier local sur votre ordinateur de développement nommé WindowsStoreProxy.xml. Pour plus d’informations sur ce fichier, consultez Utilisation du fichier WindowsStoreProxy.xml avec CurrentAppSimulator.

Pour plus d’informations sur les tâches courantes que vous pouvez effectuer à l’aide de CurrentApp et CurrentAppSimulator, consultez les articles suivants.

Sujet Description
Exclure ou limiter les fonctionnalités dans une version d’évaluation Si vous autorisez les clients à utiliser votre application gratuitement pendant une période d’évaluation, vous pouvez inciter vos clients à effectuer une mise à niveau vers la version complète de votre application en excluant ou en limitant certaines fonctionnalités pendant la période d’évaluation.
Activer les achats de produits dans l’application Que votre application soit gratuite ou non, vous pouvez vendre du contenu, d’autres applications ou de nouvelles fonctionnalités d’application (par exemple, déverrouiller le niveau suivant d’un jeu) directement dans l’application. Ici, nous vous montrons comment activer ces produits dans votre application.
Activer les achats de produits consommables dans l’application Proposez des produits consommables dans l’application ( articles qui peuvent être achetés, utilisés et achetés à nouveau) par le biais de la plateforme de commerce du Store pour fournir à vos clients une expérience d’achat robuste et fiable. Cela est particulièrement utile pour les choses telles que la devise en jeu (or, pièces, etc.) qui peuvent être achetées, puis utilisées pour acheter des power-ups spécifiques.
Gérer un grand catalogue de produits dans l’application Si votre application offre un grand catalogue de produits dans l’application, vous pouvez éventuellement suivre le processus décrit dans cette rubrique pour vous aider à gérer votre catalogue.
Utiliser les reçus pour vérifier les achats de produits Chaque transaction du Microsoft Store qui aboutit à un achat de produit réussi peut éventuellement renvoyer un reçu de transaction qui fournit des informations sur le produit répertorié et le coût financier au client. L’accès à ces informations prend en charge les scénarios dans lesquels votre application doit vérifier qu’un utilisateur a acheté votre application ou a effectué des achats de produits dans l’application à partir du Microsoft Store.

Utilisation du fichier WindowsStoreProxy.xml avec CurrentAppSimulator

Lorsque CurrentAppSimulator est utilisé, l’état initial des licences et produits in-app de votre application est décrit dans un fichier local sur votre ordinateur de développement nommé WindowsStoreProxy.xml. Méthodes CurrentAppSimulator qui modifient l’état de l’application, par exemple en achetant une licence ou en gérant un achat dans l’application, mettez uniquement à jour l’état de l’objet CurrentAppSimulator en mémoire. Le contenu de WindowsStoreProxy.xml n’est pas modifié. Lorsque l’application redémarre, l’état de la licence revient à ce qui est décrit dans WindowsStoreProxy.xml.

Un fichier WindowsStoreProxy.xml est créé par défaut à l’emplacement suivant : %UserProfile%\AppData\Local\Packages\app package folder>\<LocalState\Microsoft\Windows Store\ApiData. Vous pouvez modifier ce fichier pour définir le scénario que vous souhaitez simuler dans les propriétés CurrentAppSimulator .

Bien que vous puissiez modifier les valeurs de ce fichier, nous vous recommandons de créer votre propre fichier WindowsStoreProxy.xml (dans un dossier de données de votre projet Visual Studio) pour CurrentAppSimulator à utiliser à la place. Lors de la simulation de la transaction, appelez ReloadSimulatorAsync pour charger votre fichier. Si vous n’appelez pas ReloadSimulatorAsync pour charger votre propre fichier WindowsStoreProxy.xml, CurrentAppSimulator crée/charge (mais pas remplace) le fichier WindowsStoreProxy.xml par défaut.

Remarque

N’oubliez pas que CurrentAppSimulator n’est pas entièrement initialisé tant que ReloadSimulatorAsync n’est pas terminé. Et, étant donné que ReloadSimulatorAsync est une méthode asynchrone, vous devez prendre soin d’éviter la condition de concurrence d’interroger CurrentAppSimulator sur un thread pendant qu’il est initialisé sur un autre. Une technique consiste à utiliser un indicateur pour indiquer que l’initialisation est terminée. Une application installée à partir du Microsoft Store doit utiliser CurrentApp au lieu de CurrentAppSimulator et, dans ce cas , ReloadSimulatorAsync n’est pas appelée et, par conséquent, la condition de concurrence mentionnée ne s’applique pas. Pour cette raison, concevez votre code afin qu’il fonctionne dans les deux cas, de manière asynchrone et synchrone.

Exemples

Cet exemple est un fichier WindowsStoreProxy.xml (encodé UTF-16) qui décrit une application avec un mode d’essai qui expire à 05:00 (UTC) le 19 janvier 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>

L’exemple suivant est un fichier WindowsStoreProxy.xml (encodé UTF-16) qui décrit une application achetée, a une fonctionnalité qui expire à 05:00 (UTC) le 19 janvier 2015 et qui a un achat in-app consommable.

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

schéma

Cette section répertorie le fichier XSD qui définit la structure du fichier WindowsStoreProxy.xml. Pour appliquer ce schéma à l’éditeur XML dans Visual Studio lors de l’utilisation de votre fichier WindowsStoreProxy.xml, procédez comme suit :

  1. Ouvrez le fichier WindowsStoreProxy.xml dans Visual Studio.
  2. Dans le menu XML , cliquez sur Créer un schéma. Cela crée un fichier WindowsStoreProxy.xsd temporaire basé sur le contenu du fichier XML.
  3. Remplacez le contenu de ce fichier .xsd par le schéma ci-dessous.
  4. Enregistrez le fichier dans un emplacement où vous pouvez l’appliquer à plusieurs projets d’application.
  5. Basculez vers votre fichier WindowsStoreProxy.xml dans Visual Studio.
  6. Dans le menu XML , cliquez sur Schémas, puis recherchez la ligne dans la liste du fichier WindowsStoreProxy.xsd. Si l’emplacement du fichier n’est pas celui souhaité (par exemple, si le fichier temporaire est toujours affiché), cliquez sur Ajouter. Accédez au fichier droit, puis cliquez sur OK. Vous devez maintenant voir ce fichier dans la liste. Vérifiez qu’une coche s’affiche dans la colonne Utiliser pour ce schéma.

Une fois que vous avez effectué cette opération, les modifications que vous apportez à WindowsStoreProxy.xml sont soumises au schéma. Pour plus d’informations, consultez Guide pratique pour sélectionner les schémas XML à utiliser.

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

Descriptions des éléments et des attributs

Cette section décrit les éléments et attributs dans le fichier WindowsStoreProxy.xml.

L’élément racine de ce fichier est l’élément CurrentApp , qui représente l’application actuelle. Cet élément contient les éléments enfants suivants.

Element Obligatoire Quantity Description
ListingInformation Oui 1 Contient les données de la description de l’application.
LicenseInformation Oui 1 Décrit les licences disponibles pour cette application et ses modules complémentaires durables.
ConsommableInformation Non 0 ou 1 Décrit les modules complémentaires consommables disponibles pour cette application.
Simulation Non 0 ou 1 Décrit comment les appels à différentes méthodes CurrentAppSimulator fonctionnent dans l’application pendant le test.

Élément ListingInformation

Cet élément contient des données de la description de l’application. ListingInformation est un enfant requis de l’élément CurrentApp .

ListingInformation contient les éléments enfants suivants.

Element Obligatoire Quantity Description
Application Oui 1 Fournit des données sur l’application.
Produit Non 0 ou plus Décrit un module complémentaire pour l’application.

Élément App (enfant de ListingInformation)

Cet élément décrit la licence de l’application. L’application est un enfant requis de l’élément ListingInformation .

L’application contient les éléments enfants suivants.

Element Obligatoire Quantity Description
AppId Oui 1 GUID qui identifie l’application dans le Windows Store. Il peut s’agir de n’importe quel GUID à tester.
LinkUri Oui 1 URI de la page de description dans le magasin. Il peut s’agir de n’importe quel URI valide pour les tests.
CurrentMarket Oui 1 Pays/région du client.
AgeRating Oui 1 Entier qui représente l’évaluation minimale de l’âge de l’application. Il s’agit de la même valeur que celle que vous spécifiez dans l’Espace partenaires lorsque vous envoyez l’application. Les valeurs utilisées par le Windows Store sont les suivantes : 3, 7, 12 et 16. Pour plus d’informations sur ces évaluations, consultez Classifications d’âge.
MarketData Oui 1 ou plus Contient des informations sur l’application pour un pays/une région donné. Pour chaque pays/région dans lequel l’application est répertoriée, vous devez inclure un élément MarketData .

Élément MarketData (enfant d’App)

Cet élément fournit des informations sur l’application pour un pays/une région donné. Pour chaque pays/région dans lequel l’application est répertoriée, vous devez inclure un élément MarketData . MarketData est un enfant requis de l’élément App .

MarketData contient les éléments enfants suivants.

Element Obligatoire Quantity Description
Nom Oui 1 Nom de l’application dans ce pays/région.
Description Oui 1 Description de l’application pour ce pays/région.
Tarif Oui 1 Prix de l’application dans ce pays/région.
CurrencySymbol Oui 1 Symbole monétaire utilisé dans ce pays/région.
CurrencyCode Non 0 ou 1 Code monétaire utilisé dans ce pays/région.

MarketData a les attributs suivants.

Attribut Obligatoire Description
xml :lang Oui Spécifie le pays/la région pour lequel les informations sur les données du marché s’appliquent.

Élément Product (enfant de ListingInformation)

Cet élément décrit un module complémentaire pour l’application. Product est un enfant facultatif de l’élément ListingInformation et contient un ou plusieurs éléments MarketData .

Le produit a les attributs suivants.

Attribut Obligatoire Description
ProductId Oui Contient la chaîne utilisée par l’application pour identifier le module complémentaire.
LicenseDuration Non Indique le nombre de jours pendant lesquels la licence sera valide après l’achat de l’élément. La date d’expiration de la nouvelle licence créée par un achat de produit est la date d’achat plus la durée de la licence. Cet attribut est utilisé uniquement si l’attribut ProductType est Durable ; cet attribut est ignoré pour les modules complémentaires consommables.
ProductType Non Contient une valeur pour identifier la persistance du produit dans l’application. Les valeurs prises en charge sont Durable (valeur par défaut) et Consommable. Pour les types durables, des informations supplémentaires sont décrites par un élément Product sous LicenseInformation. Pour les types consommables, des informations supplémentaires sont décrites par un élément Product sous ConsommableInformation.

Élément MarketData (enfant de Product)

Cet élément fournit des informations sur le module complémentaire pour un pays/une région donné. Pour chaque pays/région dans lequel le module complémentaire est répertorié, vous devez inclure un élément MarketData . MarketData est un enfant requis de l’élément Product .

MarketData contient les éléments enfants suivants.

Element Obligatoire Quantity Description
Nom Oui 1 Nom du module complémentaire dans ce pays/région.
Tarif Oui 1 Prix du module complémentaire dans ce pays/région.
CurrencySymbol Oui 1 Symbole monétaire utilisé dans ce pays/région.
CurrencyCode Non 0 ou 1 Code monétaire utilisé dans ce pays/région.
Description Non 0 ou 1 Description du module complémentaire pour ce pays/région.
Tag Non 0 ou 1 Données de développeur personnalisées (également appelées balises) pour le module complémentaire.
Mots clés Non 0 ou 1 Contient jusqu’à 10 éléments de mot clé qui contiennent les mots clés du module complémentaire.
ImageUri Non 0 ou 1 URI de l’image dans la liste du module complémentaire.

MarketData a les attributs suivants.

Attribut Obligatoire Description
xml :lang Oui Spécifie le pays/la région pour lequel les informations sur les données du marché s’appliquent.

Élément LicenseInformation

Cet élément décrit les licences disponibles pour cette application et ses produits in-app durables. LicenseInformation est un enfant requis de l’élément CurrentApp .

LicenseInformation contient les éléments enfants suivants.

Element Obligatoire Quantity Description
Application Oui 1 Décrit la licence de l’application.
Produit Non 0 ou plus Décrit l’état de licence d’un module complémentaire durable dans l’application.

Le tableau suivant montre comment simuler certaines conditions courantes en combinant des valeurs sous les éléments App et Product .

Condition à simuler IsActive IsTrial ExpirationDate
Licence complète true false Absent. Il peut être présent et spécifier une date ultérieure, mais il est conseillé d’omettre l’élément du fichier XML. S’il est présent et spécifie une date dans le passé, IsActive est ignoré et pris comme false.
Pendant la période d’essai true true <datetime dans le futur> Cet élément doit être présent, car IsTrial est vrai. Vous pouvez visiter un site web montrant le temps universel coordonné actuel (UTC) pour savoir jusqu’à quel point à l’avenir pour définir cela pour obtenir la période d’essai restante souhaitée.
Version d’évaluation expirée false true <un datetime dans le passé> Cet élément doit être présent, car IsTrial est vrai. Vous pouvez visiter un site web montrant le temps universel coordonné (UTC) actuel pour savoir quand « le passé » est au format UTC.
Non valide false false <n’importe quelle valeur ou omise>

Élément d’application (enfant de LicenseInformation)

Cet élément décrit la licence de l’application. L’application est un enfant requis de l’élément LicenseInformation .

L’application contient les éléments enfants suivants.

Element Obligatoire Quantity Description
IsActive Oui 1 Décrit l’état de licence actuel de cette application. La valeur true indique que la licence est valide ; false indique une licence non valide. Normalement, cette valeur est vraie, que l’application ait un mode d’essai ou non. Définissez cette valeur sur false pour tester le comportement de votre application lorsqu’elle a une licence non valide.
IsTrial Oui 1 Décrit l’état d’évaluation actuel de cette application. La valeur true indique que l’application est utilisée pendant la période d’évaluation ; false indique que l’application n’est pas dans une version d’évaluation, soit parce que l’application a été achetée ou que la période d’évaluation a expiré.
ExpirationDate Non 0 ou 1 Date d’expiration de la période d’évaluation de cette application, en temps universel coordonné (UTC). La date doit être exprimée sous la forme : aaaa-mm-ddThh :mm :ss.ssZ. Par exemple, 05:00 le 19 janvier 2015 serait spécifié comme 2015-01-19T05:00:00.00Z. Cet élément est requis lorsque IsTrial a la valeur true. Sinon, il n’est pas nécessaire.

Élément Product (enfant de LicenseInformation)

Cet élément décrit l’état de licence d’un module complémentaire durable dans l’application. Product est un enfant facultatif de l’élément LicenseInformation .

Le produit contient les éléments enfants suivants.

Element Obligatoire Quantity Description
IsActive Oui 1 Décrit l’état de licence actuel de ce module complémentaire. La valeur true indique que le module complémentaire peut être utilisé ; false indique que le module complémentaire ne peut pas être utilisé ou n’a pas été acheté
ExpirationDate Non 0 ou 1 Date d’expiration du module complémentaire, en temps universel coordonné (UTC). La date doit être exprimée sous la forme : aaaa-mm-ddThh :mm :ss.ssZ. Par exemple, 05:00 le 19 janvier 2015 serait spécifié comme 2015-01-19T05:00:00.00Z. Si cet élément est présent, le module complémentaire a une date d’expiration. S’il n’est pas présent, le module complémentaire n’expire pas.

Le produit a les attributs suivants.

Attribut Obligatoire Description
ProductId Oui Contient la chaîne utilisée par l’application pour identifier le module complémentaire.
OfferId Non Contient la chaîne utilisée par l’application pour identifier la catégorie dans laquelle appartient le module complémentaire. Cela prend en charge les catalogues d’éléments volumineux, comme décrit dans Gérer un grand catalogue de produits in-app.

Élément de simulation

Cet élément décrit comment les appels à différentes méthodes CurrentAppSimulator fonctionnent dans l’application pendant le test. La simulation est un enfant facultatif de l’élément CurrentApp et contient zéro ou plusieurs éléments DefaultResponse .

La simulation a les attributs suivants.

Attribut Obligatoire Description
SimulationMode Non Les valeurs peuvent être interactives ou automatiques. Lorsque cet attribut est défini sur Automatique, les méthodes retournent automatiquement les codes d’erreur HRESULT spécifiés. Cela peut être utilisé lors de l’exécution de cas de test automatisés.

Élément DefaultResponse

Cet élément décrit le code d’erreur par défaut retourné par une méthode CurrentAppSimulator . DefaultResponse est un enfant facultatif de l’élément Simulation .

DefaultResponse a les attributs suivants.

Attribut Obligatoire Description
MethodName Oui Affectez cet attribut à l’une des valeurs d’énumération affichées pour le type StoreMethodName dans le schéma. Chacune de ces valeurs d’énumération représente une méthode CurrentAppSimulator pour laquelle vous souhaitez simuler une valeur de retour de code d’erreur dans votre application pendant le test. Par exemple, la valeur RequestAppPurchaseAsync_GetResult indique que vous souhaitez simuler la valeur de retour du code d’erreur de la méthode RequestAppPurchaseAsync .
HResult Oui Attribuez cet attribut à l’une des valeurs d’énumération affichées pour le type ResponseCodes dans le schéma. Chacune de ces valeurs d’énumération représente le code d’erreur que vous souhaitez retourner pour la méthode affectée à l’attribut MethodName pour cet élément DefaultResponse .

Élément ConsommableInformation

Cet élément décrit les modules complémentaires consommables disponibles pour cette application. ConsommableInformation est un enfant facultatif de l’élément CurrentApp et peut contenir zéro ou plusieurs éléments Product .

Élément Product (enfant de ConsommableInformation)

Cet élément décrit un module complémentaire consommable. Product est un enfant facultatif de l’élément ConsommableInformation .

Le produit a les attributs suivants.

Attribut Obligatoire Description
ProductId Oui Contient la chaîne utilisée par l’application pour identifier le module complémentaire consommable.
TransactionId Oui Contient un GUID (sous forme de chaîne) utilisé par l’application pour suivre la transaction d’achat d’un consommable via le processus de traitement. Consultez Activer les achats de produits consommables dans l’application.
État Oui Contient la chaîne utilisée par l’application pour indiquer l’état de traitement d’un consommable. Les valeurs peuvent être actives, PurchaseReverted, PurchasePending ou ServerError.
OfferId Non Contient la chaîne utilisée par l’application pour identifier la catégorie dans laquelle appartient le consommable. Cela prend en charge les catalogues d’éléments volumineux, comme décrit dans Gérer un grand catalogue de produits in-app.