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 :
- Ouvrez le fichier WindowsStoreProxy.xml dans Visual Studio.
- 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.
- Remplacez le contenu de ce fichier .xsd par le schéma ci-dessous.
- Enregistrez le fichier dans un emplacement où vous pouvez l’appliquer à plusieurs projets d’application.
- Basculez vers votre fichier WindowsStoreProxy.xml dans Visual Studio.
- 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. |