Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Du kan använda medlemmar i Windows.ApplicationModel.Store namnrymd för att lägga till köp i appen och utvärderingsfunktioner i din UWP-app (Universal Windows Platform) för att generera intäkter från din app. Dessa API:er ger också åtkomst till licensinformationen för din app.
Artiklarna i det här avsnittet innehåller detaljerad vägledning och kodexempel för att använda medlemmarna i Windows.ApplicationModel.Store namnrymd för flera vanliga scenarier. En översikt över grundläggande begrepp som rör köp i appen och provversioner i UWP-appar finns i köp i appen och provversioner. Ett fullständigt exempel som visar hur du implementerar utvärderingsversioner och köp i appen med hjälp av namnområdet Windows.ApplicationModel.Store finns i Store-exempel.
Viktig
Namnområdet Windows.ApplicationModel.Store uppdateras inte längre med nya funktioner. Om projektet är avsett Windows 10 Anniversary Edition (10.0; Build 14393) eller en senare version i Visual Studio (dvs. du riktar in dig på Windows 10, version 1607 eller senare) rekommenderar vi att du använder Windows.Services.Store namnrymd i stället. För mer information, se In-app-köp och provversioner. Det Windows.ApplicationModel.Store namnområdet stöds inte i Windows-skrivbordsprogram som använder Desktop Bridge eller i appar eller spel som använder en utvecklingssandlåda i Partnercenter (till exempel är detta fallet för alla spel som integreras med Xbox Live). Dessa produkter måste använda Windows.Services.Store namnområde för att implementera köp och utvärderingsversioner i appen.
Kom igång med klasserna CurrentApp och CurrentAppSimulator
Huvudinmatningspunkten till Windows.ApplicationModel.Store namnrymd är klassen CurrentApp. Den här klassen innehåller statiska egenskaper och metoder som du kan använda för att hämta information om den aktuella appen och dess tillgängliga tillägg, hämta licensinformation för den aktuella appen eller dess tillägg, köpa en app eller tillägg för den aktuella användaren och utföra andra uppgifter.
Klassen CurrentApp hämtar sina data från Microsoft Store, så du måste ha ett utvecklarkonto och appen måste publiceras i Store innan du kan använda den här klassen i din app. Innan du skickar din app till Store kan du testa koden med en simulerad version av den här klassen med namnet CurrentAppSimulator. När du har testat din app och innan du skickar den till Microsoft Store måste du ersätta instanserna av CurrentAppSimulator med CurrentApp. Din app kommer inte att klara certifieringen om den använder CurrentAppSimulator.
När CurrentAppSimulator- används beskrivs det ursprungliga tillståndet för appens licensiering och produkter i appen i en lokal fil på utvecklingsdatorn med namnet WindowsStoreProxy.xml. Mer information om den här filen finns i Använda WindowsStoreProxy.xml-filen med CurrentAppSimulator.
Mer information om vanliga uppgifter som du kan utföra med CurrentApp och CurrentAppSimulatorfinns i följande artiklar.
| Ämne | Beskrivning |
|---|---|
| Exkludera eller begränsa funktioner i en utvärderingsversion | Om du gör det möjligt för kunder att använda appen kostnadsfritt under en utvärderingsperiod kan du locka dina kunder att uppgradera till den fullständiga versionen av din app genom att exkludera eller begränsa vissa funktioner under utvärderingsperioden. |
| Aktivera produktinköp i appen | Oavsett om din app är kostnadsfri eller inte kan du sälja innehåll, andra appar eller nya appfunktioner (till exempel att låsa upp nästa nivå av ett spel) direkt i appen. Här visar vi hur du aktiverar dessa produkter i din app. |
| Aktivera förbrukningsbara produktinköp i appen | Erbjuda förbrukningsbara produkter i appar – artiklar som kan köpas, användas och köpas igen – via Store-handelsplattformen för att ge dina kunder en köpupplevelse som är både robust och tillförlitlig. Detta är särskilt användbart för saker som i spelet valuta (guld, mynt, etc.) som kan köpas och sedan användas för att köpa specifika power-ups. |
| Hantera en stor katalog med produkter i appen | Om din app erbjuder en stor produktkatalog i appen kan du också följa den process som beskrivs i det här avsnittet för att hantera katalogen. |
| Använd kvitton för att verifiera produktinköp | Varje Microsoft Store-transaktion som resulterar i ett lyckat produktköp kan eventuellt returnera ett transaktionskvitto som ger information om den angivna produkten och den ekonomiska kostnaden för kunden. Att ha åtkomst till den här informationen stöder scenarier där din app måste verifiera att en användare har köpt din app eller har gjort produktinköp i appen från Microsoft Store. |
Använda filen WindowsStoreProxy.xml med CurrentAppSimulator
När CurrentAppSimulator- används beskrivs det ursprungliga tillståndet för appens licensiering och produkter i appen i en lokal fil på utvecklingsdatorn med namnet WindowsStoreProxy.xml. CurrentAppSimulator metoder som ändrar appens tillstånd, till exempel genom att köpa en licens eller hantera ett köp i appen, uppdaterar bara tillståndet för CurrentAppSimulator-objektet i minnet. Innehållet i WindowsStoreProxy.xml ändras inte. När appen startar igen återgår licenstillståndet till det som beskrivs i WindowsStoreProxy.xml.
En WindowsStoreProxy.xml fil skapas som standard på följande plats: %UserProfile%\AppData\Local\Packages\<apppaketmapp>\LocalState\Microsoft\Windows Store\ApiData. Du kan redigera den här filen för att definiera det scenario som du vill simulera i egenskaperna CurrentAppSimulator.
Även om du kan ändra värdena i den här filen rekommenderar vi att du skapar en egen WindowsStoreProxy.xml fil (i en datamapp i Visual Studio-projektet) för CurrentAppSimulator att använda i stället. När du simulerar transaktionen anropar du ReloadSimulatorAsync för att läsa in filen. Om du inte anropar ReloadSimulatorAsync för att läsa in din egen WindowsStoreProxy.xml fil CurrentAppSimulator skapar/läser in (men skriver inte över) standardfilen för WindowsStoreProxy.xml.
Not
Tänk på att CurrentAppSimulator inte initieras helt förrän ReloadSimulatorAsync har slutförts. Och eftersom ReloadSimulatorAsync är en asynkron metod är det viktigt att undvika låsningen som uppstår när du frågar CurrentAppSimulator på en tråd medan den initieras på en annan. En teknik är att använda en flagga för att indikera att initieringen är klar. En app som installeras från Microsoft Store måste använda CurrentApp istället för CurrentAppSimulator, och i så fall anropas inte ReloadSimulatorAsync, och därför gäller inte det konkurrensvillkor som nämns. Därför utformar du koden så att den fungerar i båda fallen, både asynkront och synkront.
Exempel
Det här exemplet är en WindowsStoreProxy.xml fil (UTF-16-kodad) som beskriver en app med ett utvärderingsläge som upphör att gälla kl. 05:00 (UTC) den 19 januari 2015.
<?xml version="1.0" encoding="UTF-16"?>
<CurrentApp>
<ListingInformation>
<App>
<AppId>00001111-aaaa-2222-bbbb-3333cccc4444</AppId>
<LinkUri>http://apps.windows.microsoft.com/app/00001111-aaaa-2222-bbbb-3333cccc4444</LinkUri>
<CurrentMarket>en-US</CurrentMarket>
<AgeRating>3</AgeRating>
<MarketData xml:lang="en-us">
<Name>App with a trial license</Name>
<Description>Sample app for demonstrating trial license management</Description>
<Price>4.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</App>
</ListingInformation>
<LicenseInformation>
<App>
<IsActive>true</IsActive>
<IsTrial>true</IsTrial>
<ExpirationDate>2015-01-19T05:00:00.00Z</ExpirationDate>
</App>
</LicenseInformation>
<Simulation SimulationMode="Automatic">
<DefaultResponse MethodName="LoadListingInformationAsync_GetResult" HResult="E_FAIL"/>
</Simulation>
</CurrentApp>
Nästa exempel är en WindowsStoreProxy.xml fil (UTF-16-kodad) som beskriver en app som har köpts, har en funktion som upphör att gälla kl. 05:00 (UTC) den 19 januari 2015 och som har ett förbrukningsbart köp i appen.
<?xml version="1.0" encoding="utf-16" ?>
<CurrentApp>
<ListingInformation>
<App>
<AppId>11112222-bbbb-3333-cccc-4444dddd5555</AppId>
<LinkUri>http://apps.windows.microsoft.com/app/11112222-bbbb-3333-cccc-4444dddd5555</LinkUri>
<CurrentMarket>en-us</CurrentMarket>
<AgeRating>3</AgeRating>
<MarketData xml:lang="en-us">
<Name>App with several in-app products</Name>
<Description>Sample app for demonstrating an expiring in-app product and a consumable in-app product</Description>
<Price>5.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</App>
<Product ProductId="feature1" LicenseDuration="10" ProductType="Durable">
<MarketData xml:lang="en-us">
<Name>Expiring Item</Name>
<Price>1.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</Product>
<Product ProductId="consumable1" LicenseDuration="0" ProductType="Consumable">
<MarketData xml:lang="en-us">
<Name>Consumable Item</Name>
<Price>2.99</Price>
<CurrencySymbol>$</CurrencySymbol>
</MarketData>
</Product>
</ListingInformation>
<LicenseInformation>
<App>
<IsActive>true</IsActive>
<IsTrial>false</IsTrial>
</App>
<Product ProductId="feature1">
<IsActive>true</IsActive>
<ExpirationDate>2015-01-19T00:00:00.00Z</ExpirationDate>
</Product>
</LicenseInformation>
<ConsumableInformation>
<Product ProductId="consumable1" TransactionId="00000001-0000-0000-0000-000000000000" Status="Active"/>
</ConsumableInformation>
</CurrentApp>
Schemat
I det här avsnittet visas den XSD-fil som definierar strukturen för WindowsStoreProxy.xml-filen. Om du vill tillämpa det här schemat på XML-redigeraren i Visual Studio när du arbetar med din WindowsStoreProxy.xml-fil gör du följande:
- Öppna filen WindowsStoreProxy.xml i Visual Studio.
- På menyn XML klickar du på Skapa schema. Då skapas en tillfällig WindowsStoreProxy.xsd-fil baserat på innehållet i XML-filen.
- Ersätt innehållet i .xsd-filen med schemat nedan.
- Spara filen på en plats där du kan tillämpa den på flera appprojekt.
- Växla till din WindowsStoreProxy.xml-fil i Visual Studio.
- På XML--menyn klickar du på Schemanoch letar sedan upp raden i listan för filen WindowsStoreProxy.xsd. Om platsen för filen inte är den du vill använda (till exempel om den temporära filen fortfarande visas) klickar du på Lägg till. Gå till den högra filen och klicka sedan på OK. Nu bör du se filen i listan. Kontrollera att en bockmarkering visas i kolumnen Använd för schemat.
När du har gjort detta kommer ändringar som du gör i WindowsStoreProxy.xml att omfattas av schemat. Mer information finns i Hur man väljer de XML-scheman som ska användas.
<?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>
Beskrivningar av element och attribut
I det här avsnittet beskrivs elementen och attributen i filen WindowsStoreProxy.xml.
Rotelementet i den här filen är elementet CurrentApp som representerar den aktuella appen. Det här elementet innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| Listinformation | Ja | 1 | Innehåller data från appens lista. |
| Licensinformation | Ja | 1 | Beskriver de licenser som är tillgängliga för den här appen och dess hållbara tillägg. |
| ConsumableInformation | Nej | 0 eller 1 | Beskriver de förbrukningsbara tillägg som är tillgängliga för den här appen. |
| Simulering | Nej | 0 eller 1 | Beskriver hur anrop till olika CurrentAppSimulator metoder fungerar i appen under testningen. |
Listinformationselement
Det här elementet innehåller data från appens lista. ListingInformation är ett obligatoriskt underordnat element för elementet CurrentApp.
ListingInformation innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| App | Ja | 1 | Innehåller data om appen. |
| Produkt | Nej | 0 eller mer | Beskriver ett tillägg för appen. |
App-element (underordnad Listinformation)
Det här elementet beskriver appens licens. App är ett obligatoriskt underordnat element i elementet ListingInformation.
App innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| AppId | Ja | 1 | Den GUID som identifierar appen i butiken. Detta kan vara vilken som helst GUID för testning. |
| LinkUri | Ja | 1 | URI:n för listsidan i butiken. Detta kan vara vilken giltig URI som helst för testning. |
| CurrentMarket | Ja | 1 | Kundens land/region. |
| Åldersgräns | Ja | 1 | Ett heltal som representerar appens lägsta åldersklassificering. Det här är samma värde som du anger i Partnercenter när du skickar appen. Värdena som används av Store är: 3, 7, 12 och 16. Mer information om dessa klassificeringar finns i Åldersklassificeringar. |
| MarketData | Ja | 1 eller mer | Innehåller information om appen för ett visst land/en viss region. För varje land/region där appen visas måste du inkludera ett MarketData- element. |
MarketData-element (underordnad App)
Det här elementet innehåller information om appen för ett visst land/en viss region. För varje land/region där appen visas måste du inkludera ett MarketData- element. MarketData är ett nödvändigt underordnat element till App-elementet.
MarketData innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| Namn | Ja | 1 | Namnet på appen i det här landet/regionen. |
| Beskrivning | Ja | 1 | Beskrivningen av appen för det här landet/regionen. |
| Pris | Ja | 1 | Priset för appen i det här landet/regionen. |
| CurrencySymbol | Ja | 1 | Valutasymbolen som används i det här landet/regionen. |
| CurrencyCode | Nej | 0 eller 1 | Valutakoden som används i det här landet/regionen. |
MarketData har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| xml:lang | Ja | Anger det land/den region som informationen om marknadsdata gäller för. |
Produktelement (del av ListingInformation)
Det här elementet beskriver ett tillägg för appen. Product är ett valfritt underordnat element till ListingInformation-elementet och innehåller ett eller flera MarketData-element.
Product har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| ProductId | Ja | Innehåller strängen som används av appen för att identifiera tillägget. |
| Licensvaraktighet | Nej | Anger hur många dagar licensen ska vara giltig efter att objektet har köpts. Förfallodatumet för den nya licens som skapats av ett produktköp är inköpsdatumet plus licensens varaktighet. Det här attributet används endast om attributet ProductType är Durable; det här attributet ignoreras för förbrukningsbara tillägg. |
| ProductType | Nej | Innehåller ett värde för att identifiera beständigheten hos produkten i appen. De värden som stöds är Durable (standard) och Consumable. För varaktiga typer beskrivs ytterligare information av ett product-element under LicenseInformation; för förbrukningsbara typer beskrivs ytterligare information av ett product-element under ConsumableInformation. |
MarketData-element (del av Produkt)
Det här elementet innehåller information om tillägget för ett visst land/en viss region. För varje land/region där tillägget visas måste du inkludera ett MarketData- element. MarketData är ett obligatoriskt underordnat element till Product.
MarketData innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| Namn | Ja | 1 | Namnet på tillägget i det här landet/regionen. |
| Pris | Ja | 1 | Priset för tillägget i det här landet/regionen. |
| CurrencySymbol | Ja | 1 | Valutasymbolen som används i det här landet/regionen. |
| CurrencyCode | Nej | 0 eller 1 | Valutakoden som används i det här landet/regionen. |
| Beskrivning | Nej | 0 eller 1 | Beskrivningen av tillägget för det här landet/regionen. |
| Tagga | Nej | 0 eller 1 | Anpassade utvecklardata för (även kallad tagg) för tillägget. |
| nyckelord | Nej | 0 eller 1 | Innehåller upp till 10 nyckelordselement som innehåller nyckelord för tillägget. |
| ImageUri | Nej | 0 eller 1 | -URI:n för bilden i tilläggets beskrivning. |
MarketData har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| xml:lang | Ja | Anger det land/den region som informationen om marknadsdata gäller för. |
Licensinformationselement
Det här elementet beskriver de licenser som är tillgängliga för den här appen och dess hållbara produkter i appen. LicenseInformation är ett obligatoriskt underordnat element för elementet CurrentApp.
LicenseInformation innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| App | Ja | 1 | Beskriver appens licens. |
| Produkt | Nej | 0 eller mer | Beskriver licensstatusen för ett varaktigt tillägg i appen. |
I följande tabell visas hur du simulerar några vanliga villkor genom att kombinera värden under elementen App och Product.
| Villkor som ska simuleras | IsActive | IsTrial | Utgångsdatum |
|---|---|---|---|
| Fullständigt licensierad | sann | falsk | Frånvarande. Det kan faktiskt finnas och ange ett framtida datum, men du rekommenderas att utelämna elementet från XML-filen. Om den finns och anger ett datum tidigare ignoreras IsActive- och anses vara falskt. |
| Under utvärderingsperioden | sann | sann | <en tidpunkt i framtiden> Det här elementet måste finnas eftersom IsTrial är sann. Du kan besöka en webbplats som visar den aktuella koordinerade universella tiden (UTC) för att veta hur långt fram i tiden du ska ställa in detta för att få den återstående provperiod du önskar. |
| Provversionen har gått ut | falsk | sann | <ett tidigare datum och tidpunkt> Det här elementet måste finnas eftersom IsTrial är sant. Du kan besöka en webbplats som visar den aktuella samordnade universella tiden (UTC) för att veta vad som är "det förflutna" i UTC. |
| Ogiltig | falsk | falsk | <valfritt värde eller utelämnat> |
App-element (del av LicenseInformation)
Det här elementet beskriver appens licens. App är ett obligatoriskt element som är underordnat elementet LicenseInformation.
App innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| IsActive | Ja | 1 | Beskriver appens aktuella licenstillstånd. Värdet sant anger att licensen är giltig. false anger en ogiltig licens. Normalt är det här värdet sant, oavsett om appen har ett utvärderingsläge eller inte. Ange det här värdet till falskt för att testa hur din app beter sig när den har en ogiltig licens. |
| IsTrial | Ja | 1 | Beskriver det aktuella utvärderingstillståndet för den här appen. Värdet sant anger att appen används under utvärderingsperioden. falska anger att appen inte är i en utvärderingsversion, antingen för att appen har köpts eller om utvärderingsperioden har upphört att gälla. |
| Utgångsdatum | Nej | 0 eller 1 | Det datum då utvärderingsperioden för den här appen upphör att gälla, i Coordinated Universal Time (UTC). Datumet måste uttryckas som: åååå-mm-ddThh:mm:ss.ssZ. Till exempel anges 05:00 den 19 januari 2015 som 2015-01-19T05:00:00.00Z. Det här elementet krävs när IsTrial är sant. Annars krävs det inte. |
Produktelement (underordnad LicenseInformation)
Det här elementet beskriver licensstatusen för ett varaktigt tillägg i appen. Product är ett valfritt underordnat element till LicenseInformation.
Product innehåller följande underordnade element.
| Element | Krävs | Kvantitet | Beskrivning |
|---|---|---|---|
| IsActive | Ja | 1 | Beskriver det aktuella licenstillståndet för det här tillägget. Värdet sant anger att tillägget kan användas. falskt anger att tillägget inte kan användas eller inte har köpts |
| Utgångsdatum | Nej | 0 eller 1 | Det datum då tillägget upphör att gälla, i Coordinated Universal Time (UTC). Datumet måste uttryckas som: åååå-mm-ddThh:mm:ss.ssZ. Till exempel anges 05:00 den 19 januari 2015 som 2015-01-19T05:00:00.00Z. Om det här elementet finns har tillägget ett förfallodatum. Om det inte finns upphör tillägget inte att gälla. |
Product har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| ProduktId | Ja | Innehåller strängen som används av appen för att identifiera tillägget. |
| OfferId | Nej | Innehåller strängen som används av appen för att identifiera den kategori som tillägget tillhör. Detta ger stöd för stora objektkataloger enligt beskrivningen i Hantera en stor katalog med produkter i appen. |
Simuleringselement
Det här elementet beskriver hur anrop till olika CurrentAppSimulator metoder fungerar i appen under testningen. Simulering är ett valfritt underordnat element till CurrentApp-elementet och kan innehålla noll eller fler DefaultResponse-element.
Simulering har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| SimulationMode | Nej | Värden kan vara interaktiva eller automatiska. När det här attributet är inställt på Automatiskreturnerar metoderna automatiskt de angivna HRESULT-felkoderna. Detta kan användas när du kör automatiserade testfall. |
DefaultResponse-elementet
Det här elementet beskriver standardfelkoden som returneras av en CurrentAppSimulator-metod. DefaultResponse är ett valfritt underordnat element som ingår i elementet Simulering.
DefaultResponse har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| MethodName | Ja | Tilldela det här attributet till ett av uppräkningsvärdena som visas för typen StoreMethodName i schema. Var och en av dessa enum-värden representerar en CurrentAppSimulator- metod för vilken du vill simulera ett returvärde för felkod i appen vid testningen. Värdet RequestAppPurchaseAsync_GetResult anger till exempel att du vill simulera felkodens returvärde för metoden RequestAppPurchaseAsync. |
| HResult | Ja | Tilldela det här attributet till något av uppräkningsvärdena som visas för ResponseCodes typ i schema. Var och en av dessa uppräkningsvärden representerar felkoden som du vill returnera för metoden som har tilldelats attributet MethodName för det här DefaultResponse--elementet. |
Förbrukningsinformationselementet
Det här elementet beskriver de förbrukningsbara tillägg som är tillgängliga för den här appen. ConsumableInformation är ett valfritt underordnat element för elementet CurrentApp, och det kan innehålla noll eller fler Product-element.
Produktelement (underordnad ConsumableInformation)
Det här elementet beskriver ett förbrukningsbart tillägg. Product är ett valfritt underordnat element för elementet ConsumableInformation.
Product har följande attribut.
| Attribut | Krävs | Beskrivning |
|---|---|---|
| Produkt-ID | Ja | Innehåller strängen som används av appen för att identifiera det förbrukningsbara tillägget. |
| Transaktions-ID | Ja | Innehåller ett GUID (som en sträng) som används av appen för att spåra inköpstransaktionen för en förbrukningsprodukt genom slutförandeprocessen. Se Aktivera förbrukningsbara produktinköp i appen. |
| status | Ja | Innehåller strängen som används av appen för att indikera uppfyllelsestatusen för en konsumtionsvara. Värden kan vara Active, PurchaseReverted, PurchasePendingeller ServerError. |
| OfferId | Nej | Innehåller strängen som används av appen för att identifiera den kategori där förbrukningsvarorna hör till. Detta ger stöd för stora objektkataloger enligt beskrivningen i Hantera en stor katalog med produkter i appen. |