Acquisti in-app e versioni di valutazione mediante lo spazio dei nomi Windows.ApplicationModel.Store
È possibile usare membri nello spazio dei nomi Windows.ApplicationModel.Store per aggiungere funzionalità per acquisti in-app e versioni di valutazione all'app UWP (Universal Windows Platform) per consentire la monetizzazione dell'app. Queste API forniscono anche accesso alle informazioni sulla licenza per l'app.
Gli articoli di questa sezione forniscono indicazioni approfondite ed esempi di codice per l'uso di membri nello spazio dei nomi Windows.ApplicationModel.Store in diversi scenari comuni. Per una panoramica dei concetti di base relativi agli acquisti in-app nelle app UWP, vedere Acquisti in-app e versioni di valutazione. Per un esempio completo che illustra come implementare le versioni di valutazione e gli acquisti in-app mediante lo spazio dei nomi Windows.ApplicationModel.Store, vedere l'Esempio di Store.
Importante
Lo spazio dei nomi Windows.ApplicationModel.Store non verrà più aggiornato con le nuove funzionalità. Se il progetto è destinato a Windows 10 Anniversary Edition (10.0; Build 14393) o una versione successiva in Visual Studio (ossia è destinato a Windows 10, versione 1607 o successiva), si consiglia di usare invece lo spazio dei nomi Windows.Services.Store. Per ulteriori informazioni, vedere Acquisti in-app e versioni di valutazione. Lo spazio dei nomi Windows.ApplicationModel.Store non è supportato nelle applicazioni desktop di Windows che usano Desktop Bridge né nelle app o nei giochi che usano una sandbox di sviluppo nel Centro per i partner (ad esempio, qualsiasi gioco che si integra con Xbox Live). Questi prodotti devono usare lo spazio dei nomi Windows.Services.Store per implementare acquisti in-app e versioni di valutazione.
Introduzione alle classi CurrentApp e CurrentAppSimulator
Il punto di ingresso principale dello spazio dei nomi Windows.ApplicationModel.Store è la classe CurrentApp. Questa classe fornisce proprietà e metodi statici che è possibile usare per ottenere informazioni per l'app corrente e i relativi componenti aggiuntivi disponibili, ottenere informazioni sulla licenza per l'app corrente o i relativi componenti aggiuntivi, acquistare un'app o un componente aggiuntivo per l'utente corrente ed eseguire altre attività.
La classe CurrentApp ottiene i dati da Microsoft Store, pertanto è necessario avere un account sviluppatore e l'app deve essere pubblicata nello Store per poter usare questa classe nell'app. Prima di inviare l'app allo Store, è possibile testare il codice con una versione simulata di questa classe denominata CurrentAppSimulator. Dopo aver testato l'app e prima di inviarla a Microsoft Store, è necessario sostituire le istanze di CurrentAppSimulator con CurrentApp. Se l'app usa CurrentAppSimulator, la certificazione avrà esito negativo.
Quando si usa CurrentAppSimulator, lo stato iniziale della licenza dell'app e dei prodotti in-app è descritto in un file locale nel computer di sviluppo denominato WindowsStoreProxy.xml. Per ulteriori informazioni su questo file, vedere Uso del file WindowsStoreProxy.xml con CurrentAppSimulator.
Per ulteriori informazioni sulle attività comuni che è possibile eseguire con CurrentApp e CurrentAppSimulator, vedere gli articoli seguenti.
Argomento | Descrizione |
---|---|
Escludere o limitare funzionalità in una versione di prova | Se si consente ai clienti di usare l'app gratuitamente per un periodo di valutazione, è possibile invogliare i clienti a effettuare l'aggiornamento alla versione completa dell'app escludendo o limitando alcune funzionalità durante il periodo di valutazione. |
Abilitare gli acquisti di prodotti in-app | Indipendentemente dal fatto che l'app sia gratuita o meno, è possibile vendere contenuti, altre app o nuove funzionalità dell'app (ad esempio sbloccare il livello successivo di un gioco) direttamente all'interno dell'app. Qui mostreremo come abilitare questi prodotti nell'app. |
Abilitare gli acquisti di prodotti di consumo in-app | Offrire prodotti in-app di consumo (elementi che possono essere acquistati, usati e acquistati di nuovo) attraverso la piattaforma di commercio dello Store per fornire ai clienti un'esperienza di acquisto efficace e affidabile. Questo è particolarmente utile per elementi quali il denaro usato nel gioco (oro, monete e così via) che possono essere acquistati e poi usati per acquistare potenziamenti specifici. |
Gestire un catalogo di prodotti in-app di grandi dimensioni | Se l'app offre un ampio catalogo di prodotti in-app, è possibile eseguire la procedura descritta in questo argomento per gestire il catalogo. |
Usare le ricevute per verificare gli acquisti di prodotti | Ogni transazione in Microsoft Store che si conclude con l'acquisto di un prodotto può restituire una ricevuta della transazione che fornisce informazioni sul prodotto relativo e sul costo per il cliente. L'accesso a queste informazioni supporta scenari in cui l'app deve verificare che un utente abbia acquistato l'app o abbia effettuato acquisti di prodotti in-app da Microsoft Store. |
Uso del file WindowsStoreProxy.xml con CurrentAppSimulator
Quando si usa CurrentAppSimulator, lo stato iniziale della licenza dell'app e dei prodotti in-app è descritto in un file locale nel computer di sviluppo denominato WindowsStoreProxy.xml. I metodi CurrentAppSimulator che modificano lo stato dell'app, ad esempio l'acquisto di una licenza o la gestione di un acquisto in-app, aggiornano solo lo stato dell'oggetto CurrentAppSimulator in memoria. Il contenuto di WindowsStoreProxy.xml non viene modificato. Quando l'app viene riavviata, lo stato della licenza torna a quello descritto in WindowsStoreProxy.xml.
Per impostazione predefinita viene creato un file WindowsStoreProxy.xml nella seguente posizione: %UserProfile%\AppData\Local\Packages\<cartella pacchetto app>\LocalState\Microsoft\Windows Store\ApiData. È possibile modificare questo file per definire lo scenario da simulare nelle proprietà CurrentAppSimulator .
Anche se è possibile modificare i valori in questo file, è consigliabile creare il proprio file WindowsStoreProxy.xml (in una cartella dati del progetto Visual Studio) per l'uso da parte di CurrentAppSimulator. Quando si simula la transazione, chiamare ReloadSimulatorAsync per caricare il file. Se non si chiama ReloadSimulatorAsync per caricare il proprio file WindowsStoreProxy.xml, CurrentAppSimulator crea o carica (ma non sovrascrive) il file WindowsStoreProxy.xml predefinito.
Nota
Tenere presente che CurrentAppSimulator non viene inizializzato completamente finché ReloadSimulatorAsync non viene completato. Inoltre, poiché ReloadSimulatorAsync è un metodo asincrono, occorre prestare attenzione per evitare la race condition causata dall'esecuzione di query su CurrentAppSimulator in un thread mentre è in fase di inizializzazione in un altro. Una tecnica consiste nell'usare un flag per indicare che l'inizializzazione è completa. Un'app installata da Microsoft Store deve usare CurrentApp invece di CurrentAppSimulator e in tal caso ReloadSimulatorAsync non viene chiamato, pertanto tale race condition non si verifica. Per questo motivo, progettare il codice in modo che funzioni in entrambi i casi, sia in modo asincrono che sincrono.
Esempi
Questo esempio è un file WindowsStoreProxy.xml (con codifica UTF-16) che descrive un'app la cui modalità di valutazione scade il 19 gennaio 2015 alle 05:00 (UTC).
<?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'esempio seguente è un file WindowsStoreProxy.xml (con codifica UTF-16) che descrive un'app acquistata dotata di una funzionalità con scadenza il 19 gennaio 2015 alle 05:00 (UTC) e che include un acquisto in-app di un prodotto di consumo.
<?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>
Schema
Questa sezione mostra il listato del file XSD che definisce la struttura del file WindowsStoreProxy.xml. Per applicare questo schema all'editor XML in Visual Studio quando si usa il file WindowsStoreProxy.xml, eseguire le operazioni seguenti:
- Aprire il file WindowsStoreProxy.xml in Visual Studio.
- Nel menu XML fare clic su Crea schema. Verrà creato un file WindowsStoreProxy.xsd temporaneo basato sul contenuto del file XML.
- Sostituire il contenuto di tale file XSD con lo schema seguente.
- Salvare il file in un percorso da cui sia possibile applicarlo a più progetti di app.
- Passare al file WindowsStoreProxy.xml in Visual Studio.
- Nel menu XML fare clic su Schemi, quindi individuare la riga nel listato del file WindowsStoreProxy.xsd. Se la posizione del file non è quella desiderata (ad esempio, se viene ancora mostrato il file temporaneo, fare clic su Aggiungi. Andare al file corretto e fare clic su OK. Il file dovrebbe essere ora visualizzato nell'elenco. Assicurarsi che sia presente un segno di spunta nella colonna Usa per tale schema.
Dopo aver completato questa operazione, le modifiche apportate a WindowsStoreProxy.xml saranno soggette allo schema. Per ulteriori informazioni, vedere Procedura: selezionare gli schemi XML da usare.
<?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>
Descrizioni di elementi e attributi
Questa sezione descrive gli elementi e gli attributi nel file WindowsStoreProxy.xml.
L'elemento radice di questo file è l'elemento CurrentApp che rappresenta l'app corrente. Questo elemento contiene i seguenti elementi figlio:
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
ListingInformation | Sì | 1 | Contiene i dati della presentazione dell'app. |
LicenseInformation | Sì | 1 | Descrive le licenze disponibili per questa app e i relativi componenti aggiuntivi durevoli. |
ConsumableInformation | No | 0 o 1 | Descrive i componenti aggiuntivi di consumo disponibili per questa app. |
Simulazione | No | 0 o 1 | Descrive il funzionamento nell'app delle chiamate ai vari metodi CurrentAppSimulator durante il test. |
Elemento ListingInformation
Questo elemento contiene i dati della presentazione dell'app. ListingInformation è un elemento figlio obbligatorio dell'elemento CurrentApp.
ListingInformation contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
App | Sì | 1 | Fornisce dati sull'app. |
Prodotto | No | 0 o più personalizzati | Descrive un componente aggiuntivo per l'app. |
Elemento App (elemento figlio di ListingInformation)
Questo elemento descrive la licenza dell'app. App è un elemento figlio obbligatorio dell'elemento ListingInformation.
App contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
AppId | Sì | 1 | GUID che identifica l'app nello Store. Può essere qualsiasi GUID per il test. |
LinkUri | Sì | 1 | URI della pagina di presentazione nello Store. Può essere qualsiasi URI valido per il test. |
CurrentMarket | Sì | 1 | Paese/area geografica del cliente. |
AgeRating | Sì | 1 | Numero intero che rappresenta la fascia di età minima per l'età. Questo è lo stesso valore specificato nel Centro per i partner quando si invia l'app. I valori usati dallo Store sono: 3, 7, 12 e 16. Per ulteriori informazioni sulle fasce d'età, vedere Fasce d'età. |
MarketData | Sì | 1 o più | Contiene informazioni sull'app per un determinato paese/area geografica. È necessario includere un elemento MarketData per ogni Paese/area geografica in cui l'app è presentata. |
Elemento MarketData (elemento figlio di App)
Questo elemento fornisce informazioni sull'app per un determinato Paese/area geografica. È necessario includere un elemento MarketData per ogni Paese/area geografica in cui l'app è presentata. MarketData è un elemento figlio obbligatorio dell'elemento App.
MarketData contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
Nome | Sì | 1 | Nome dell'app in questo Paese/area geografica. |
Descrizione | Sì | 1 | Descrizione dell'app per questo Paese/area geografica. |
Price | Sì | 1 | Prezzo dell'app in questo Paese/area geografica. |
Currencysimbolo | Sì | 1 | Simbolo di valuta usato in questo Paese/area geografica. |
CurrencyCode | No | 0 o 1 | Codice di valuta usato in questo Paese/area geografica. |
MarketData ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
xml:lang | Sì | Specifica il Paese/area geografica per cui si applicano le informazioni sui dati di mercato. |
Elemento Product (elemento figlio di ListingInformation)
Questo elemento descrive un componente aggiuntivo per l'app. Product è un elemento figlio facoltativo dell'elemento ListingInformation e contiene uno o più elementi MarketData.
Product ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
ProductId | Sì | Contiene la stringa usata dall'app per identificare il componente aggiuntivo. |
LicenseDuration | No | Indica il numero di giorni per cui la licenza sarà valida dopo l'acquisto dell'articolo. La data di scadenza della nuova licenza creata dall'acquisto di un prodotto è la data di acquisto più la durata della licenza. Questo attributo viene usato solo se l'attributo ProductType è Durable. Questo attributo viene ignorato per i componenti aggiuntivi di consumo. |
ProductType | No | Contiene un valore per identificare la persistenza del prodotto in-app. I valori supportati sono Durable (impostazione predefinita) e Consumable. Per i tipi durevoli le informazioni aggiuntive sono descritte da un elemento Product in LicenseInformation, per i tipi a consumo le informazioni aggiuntive sono descritte da un elemento Product in ConsumableInformation. |
Elemento MarketData (elemento figlio di Product)
Questo elemento fornisce informazioni sul componente aggiuntivo per un determinato Paese/area geografica. È necessario includere un elemento MarketData per ogni Paese/area geografica in cui il componente aggiuntivo è presentato. MarketData è un elemento figlio obbligatorio dell'elemento Product.
MarketData contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
Nome | Sì | 1 | Nome del componente aggiuntivo in questo Paese/area geografica. |
Price | Sì | 1 | Prezzo del componente aggiuntivo in questo Paese/area geografica. |
Currencysimbolo | Sì | 1 | Simbolo di valuta usato in questo Paese/area geografica. |
CurrencyCode | No | 0 o 1 | Codice di valuta usato in questo Paese/area geografica. |
Descrizione | No | 0 o 1 | Descrizione del componente aggiuntivo per questo Paese/area geografica. |
Tag | No | 0 o 1 | Dati personalizzati dello sviluppatore (anche denominati tag) per il componente aggiuntivo. |
Parole chiave | No | 0 o 1 | Contiene fino a 10 elementi Keyword contengono le parole chiave per il componente aggiuntivo. |
ImageUri | No | 0 o 1 | URI per l'immagine nella presentazione del componente aggiuntivo. |
MarketData ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
xml:lang | Sì | Specifica il Paese/area geografica per cui si applicano le informazioni sui dati di mercato. |
Elemento LicenseInformation
Questo elemento descrive le licenze disponibili per questa app e i relativi prodotti in-app durevoli. LicenseInformation è un elemento figlio obbligatorio dell'elemento CurrentApp.
LicenseInformation contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
App | Sì | 1 | Descrive la licenza dell'app. |
Prodotto | No | 0 o più personalizzati | Descrive lo stato della licenza di un componente aggiuntivo durevole nell'app. |
La tabella seguente illustra come simulare alcune condizioni comuni combinando i valori negli elementi App e Product.
Condizione da simulare | IsActive | IsTrial | ExpirationDate |
---|---|---|---|
Licenza completa | true | false | Assente. Potrebbe essere presente e specificare una data futura, ma è consigliabile omettere l'elemento dal file XML. Se è presente e specifica una data passata, IsActive verrà ignorato e considerato su false. |
Periodo di valutazione in corso | true | true | <una data futura> Questo elemento deve essere presente poiché IsTrial è true. È possibile visitare un sito Web che mostri l'ora UTC (Coordinated Universal Time) corrente per sapere quanto distante nel futuro impostare questa data per ottenere il periodo di valutazione rimanente desiderato. |
Periodo di valutazione scaduto | false | true | <una data passata> Questo elemento deve essere presente poiché IsTrial è true. È possibile visitare un sito Web che mostri l'ora UTC (Coordinated Universal Time) corrente per determinare "il passato" in base all'orario UTC. |
Non valido | false | false | <qualsiasi valore o omesso> |
Elemento App (elemento figlio di LicenseInformation)
Questo elemento descrive la licenza dell'app. App è un elemento figlio obbligatorio dell'elemento LicenseInformation.
App contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
IsActive | Sì | 1 | Descrive lo stato corrente della licenza dell'app. true indica che la licenza è valida, false indica una licenza non valida. In genere questo valore è true, indipendentemente dal fatto che l'app abbia una modalità di valutazione o meno. Impostare questo valore su false per testare il comportamento dell'app quando dispone di una licenza non valida. |
IsTrial | Sì | 1 | Descrive lo stato di valutazione corrente dell'app. true indica che l'app viene usata durante il periodo di valutazione, false indica che l'app non è in fase di valutazione, perché è stata acquistata o perché il periodo di valutazione è scaduto. |
ExpirationDate | No | 0 o 1 | Data di scadenza del periodo di valutazione per questa app, in base all'orario UTC (Coordinated Universal Time). La data deve essere espressa nel formato: aaaa-mm-ggThh:mm:ss.ssZ. Ad esempio le ore 05:00 del 19 gennaio 2015 sarebbero specificate come 2015-01-19T05:00:00.00Z. Questo elemento è obbligatorio quando IsTrial è true. In caso contrario, non è obbligatorio. |
Elemento Product (elemento figlio di LicenseInformation)
Questo elemento descrive lo stato della licenza di un componente aggiuntivo durevole nell'app. Product è un elemento figlio facoltativo dell'elemento LicenseInformation .
Product contiene gli elementi figlio seguenti.
Elemento | Richiesto | Quantità | Descrizione |
---|---|---|---|
IsActive | Sì | 1 | Descrive lo stato corrente della licenza del componente aggiuntivo. true indica che il componente aggiuntivo può essere usato, false indica che il componente aggiuntivo non può essere usato o è stato acquistato |
ExpirationDate | No | 0 o 1 | Data di scadenza del componente aggiuntivo, in base all'orario UTC (Coordinated Universal Time). La data deve essere espressa nel formato: aaaa-mm-ggThh:mm:ss.ssZ. Ad esempio le ore 05:00 del 19 gennaio 2015 sarebbero specificate come 2015-01-19T05:00:00.00Z. Se questo elemento è presente, il componente aggiuntivo ha una data di scadenza. Se non è presente, il componente aggiuntivo non scade. |
Product ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
ProductId | Sì | Contiene la stringa usata dall'app per identificare il componente aggiuntivo. |
OfferId | No | Contiene la stringa usata dall'app per identificare la categoria a cui appartiene il componente aggiuntivo. Ciò fornisce supporto per i cataloghi di articoli di grandi dimensioni, come descritto in Gestire un catalogo di prodotti in-app di grandi dimensioni. |
Elemento Simulation
Questo elemento descrive il funzionamento nell'app delle chiamate ai vari metodi CurrentAppSimulator durante il test. Simulation è un elemento figlio facoltativo dell'elemento CurrentApp e contiene zero o più elementi DefaultResponse .
L'elemento Simulation ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
SimulationMode | No | I valori possono essere Interactive o Automatic. Quando questo attributo è impostato su Automatic, i metodi restituiranno automaticamente i codici di errore HRESULT specificati. Questa operazione può essere usata quando si eseguono test case automatizzati. |
Elemento DefaultResponse
Questo elemento descrive il codice di errore predefinito restituito da un metodo CurrentAppSimulator . DefaultResponse è un elemento figlio facoltativo dell'elemento Simulation .
L'elemento DefaultResponse ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
MethodName | Sì | Assegnare questo attributo a uno dei valori di enumerazione visualizzati per il tipo StoreMethodName nello schema. Ognuno di questi valori di enumerazione rappresenta un metodo CurrentAppSimulator per il quale si desidera simulare un valore restituito di codice di errore nell'app durante il test. Ad esempio, il valore RequestAppPurchaseAsync_GetResult indica che si desidera simulare il valore restituito di codice di errore del metodo RequestAppPurchaseAsync . |
HResult | Sì | Assegnare questo attributo a uno dei valori di enumerazione visualizzati per il tipo ResponseCodes nello schema. Ognuno di questi valori di enumerazione rappresenta il codice di errore che si desidera restituire per il metodo assegnato all'attributo MethodName per questo elemento DefaultResponse . |
Elemento ConsumableInformation
Questo elemento descrive i componenti aggiuntivi di consumo disponibili per questa app. ConsumableInformation è un elemento figlio facoltativo dell'elemento CurrentApp e può contenere zero o più elementi Product .
Elemento Product (elemento figlio di ConsumableInformation)
Questo elemento descrive un componente aggiuntivo di consumo. Product è un elemento figlio facoltativo dell'elemento ConsumableInformation .
Product ha gli attributi seguenti.
Attributo | Obbligatorio | Descrizione |
---|---|---|
ProductId | Sì | Contiene la stringa usata dall'app per identificare il componente aggiuntivo di consumo. |
TransactionId | Sì | Contiene un GUID (come stringa) usato dall'app per tenere traccia della transazione di acquisto di un prodotto di consumo tramite il processo di evasione. Vedere Abilitare gli acquisti di prodotti di consumo in-app. |
Stato | Sì | Contiene la stringa usata dall'app per indicare lo stato di evasione di un prodotto di consumo. I valori possono essere Active, PurchaseReverted, PurchasePending o ServerError. |
OfferId | No | Contiene la stringa usata dall'app per identificare la categoria a cui appartiene il prodotto di consumo. Ciò fornisce supporto per i cataloghi di articoli di grandi dimensioni, come descritto in Gestire un catalogo di prodotti in-app di grandi dimensioni. |