In-App-Käufe und Testversionen mit dem Namespace „Windows.ApplicationModel.Store“
Sie können Mitglieder im Windows.ApplicationModel.Store-Namespace verwenden, um In-App-Käufe und Testfunktionen zu Ihrer Universelle Windows-Plattform (UWP)-App hinzuzufügen, um ihre App zu monetarisieren. Diese APIs bieten auch Zugriff auf die Lizenzinformationen für Ihre App.
Die Artikel in diesem Abschnitt enthalten ausführliche Anleitungen und Codebeispiele für die Verwendung der Member im Windows.ApplicationModel.Store-Namespace für mehrere gängige Szenarien. Eine Übersicht über grundlegende Konzepte im Zusammenhang mit In-App-Käufen in UWP-Apps finden Sie unter In-App-Käufe und Testversionen. Ein vollständiges Beispiel, das veranschaulicht, wie Testversionen und In-App-Käufe mit dem Windows.ApplicationModel.Store-Namespace implementiert werden, finden Sie im Store-Beispiel.
Wichtig
Der Windows.ApplicationModel.Store Namespace wird nicht mehr mit neuen Features aktualisiert. Wenn Ihr Projekt auf Windows 10 Anniversary Edition ausgerichtet ist (10.0; Build 14393) oder eine höhere Version in Visual Studio (d. h., Sie sind auf Windows 10, Version 1607 oder höher ausgerichtet), empfehlen wir, stattdessen den Windows.Services.Store Namespace zu verwenden. Weitere Informationen finden Sie unter In-App-Käufe und Testversionen. Der Namespace Windows.ApplicationModel.Store wird in Windows-Desktopanwendungen, die die Desktop-Brücke nutzen, sowie in Apps oder Spielen, die eine Entwicklungs-Sandbox in Partner Center verwenden (was beispielsweise bei allen Spielen der Fall ist, die in Xbox Live integriert sind), nicht unterstützt. Diese Produkte müssen den Windows.Services.Store Namespace verwenden, um In-App-Käufe und Testversionen zu implementieren.
Erste Schritte mit den Klassen CurrentApp und CurrentAppSimulator
Der Haupteinstiegspunkt zum Windows.ApplicationModel.Store Namespace ist die CurrentApp-Klasse . Diese Klasse stellt statische Eigenschaften und Methoden bereit, mit denen Sie Informationen für die aktuelle App und die verfügbaren Add-Ons abrufen, Lizenzinformationen für die aktuelle App oder ihre Add-Ons abrufen, eine App oder ein Add-On für den aktuellen Benutzer erwerben und andere Aufgaben ausführen können.
Die CurrentApp-Klasse ruft ihre Daten aus dem Microsoft Store ab. Daher müssen Sie über ein Entwicklerkonto verfügen und die App im Store veröffentlicht werden, bevor Sie diese Klasse erfolgreich in Ihrer App verwenden können. Bevor Sie Ihre App an den Store übermitteln, können Sie Ihren Code mit einer simulierten Version dieser Klasse mit dem Namen CurrentAppSimulator testen. Nachdem Sie Ihre App getestet haben und sie an den Microsoft Store übermitteln, müssen Sie die Instanzen von CurrentAppSimulator durch CurrentApp ersetzen. Ihre App schlägt eine Zertifizierung fehl, wenn sie CurrentAppSimulator verwendet.
Wenn der CurrentAppSimulator verwendet wird, wird der anfängliche Zustand der Lizenzierung und der In-App-Produkte in einer lokalen Datei auf Ihrem Entwicklungscomputer mit dem Namen WindowsStoreProxy.xml beschrieben. Weitere Informationen zu dieser Datei finden Sie unter Verwenden der WindowsStoreProxy.xml-Datei mit CurrentAppSimulator.
Weitere Informationen zu allgemeinen Aufgaben, die Sie mit CurrentApp und CurrentAppSimulator ausführen können, finden Sie in den folgenden Artikeln.
Thema | Beschreibung |
---|---|
Ausschließen oder Einschränken von Features in einer Testversion | Wenn Sie Kunden die kostenlose Nutzung Ihrer App während eines Testzeitraums ermöglichen, können Sie Ihre Kunden dazu verleiten, ein Upgrade auf die Vollversion Ihrer App durchzuführen, indem Sie einige Features während des Testzeitraums ausschließen oder einschränken. |
Aktivieren von In-App-Produktkäufen | Unabhängig davon, ob Ihre App kostenlos ist oder nicht, können Sie Inhalte, andere Apps oder neue App-Funktionen (z. B. das Entsperren der nächsten Stufe eines Spiels) direkt innerhalb der App verkaufen. Hier zeigen wir Ihnen, wie Sie diese Produkte in Ihrer App aktivieren. |
Aktivieren von konsumierbaren In-App-Produktkäufen | Bieten Sie konsumierbare In-App-Produkte – Artikel, die gekauft, verwendet und wieder gekauft werden können – über die Store-Commerce-Plattform, um Ihren Kunden eine kauffreundliche und zuverlässige Einkaufserfahrung zu bieten. Dies ist besonders nützlich für Dinge wie In-Game-Währung (Gold, Münzen usw.), die gekauft und dann zum Kauf bestimmter Power-Ups verwendet werden können. |
Verwalten eines großen Katalogs von In-App-Produkten | Wenn Ihre App einen großen In-App-Produktkatalog anbietet, können Sie optional dem in diesem Thema beschriebenen Prozess folgen, um Den Katalog zu verwalten. |
Verwenden von Bestätigungen zum Überprüfen von Produktkäufen | Jede Microsoft Store-Transaktion, die zu einem erfolgreichen Produktkauf führt, kann optional einen Transaktionsbeleg zurückgeben, der Informationen über das aufgeführte Produkt und die geldpolitischen Kosten für den Kunden bereitstellt. Der Zugriff auf diese Informationen unterstützt Szenarien, in denen Ihre App überprüfen muss, ob ein Benutzer Ihre App erworben hat oder In-App-Produktkäufe aus dem Microsoft Store getätigt hat. |
Verwenden der WindowsStoreProxy.xml Datei mit CurrentAppSimulator
Wenn der CurrentAppSimulator verwendet wird, wird der anfängliche Zustand der Lizenzierung und der In-App-Produkte in einer lokalen Datei auf Ihrem Entwicklungscomputer mit dem Namen WindowsStoreProxy.xml beschrieben. CurrentAppSimulator-Methoden , die den Zustand der App ändern, z. B. durch Kauf einer Lizenz oder Behandeln eines In-App-Kaufs, aktualisieren nur den Status des CurrentAppSimulator-Objekts im Arbeitsspeicher. Die Inhalte von WindowsStoreProxy.xml werden nicht geändert. Wenn die App erneut gestartet wird, wird der Lizenzstatus auf die in WindowsStoreProxy.xml beschriebenen Elemente zurückgesetzt.
Eine WindowsStoreProxy.xml Datei wird standardmäßig am folgenden Speicherort erstellt: %UserProfile%\AppData\Local\Packages\<app package folder>\LocalState\Microsoft\Windows Store\ApiData. Sie können diese Datei bearbeiten, um das Szenario zu definieren, das Sie in den CurrentAppSimulator-Eigenschaften simulieren möchten.
Obwohl Sie die Werte in dieser Datei ändern können, empfiehlt es sich, stattdessen eigene WindowsStoreProxy.xml Datei (in einem Datenordner Ihres Visual Studio-Projekts) für CurrentAppSimulator zu erstellen. Rufen Sie beim Simulieren der Transaktion ReloadSimulatorAsync auf, um Die Datei zu laden. Wenn Sie ReloadSimulatorAsync nicht aufrufen, um Ihre eigene WindowsStoreProxy.xml Datei zu laden, erstellt/lädt CurrentAppSimulator die standarddatei WindowsStoreProxy.xml.
Hinweis
Beachten Sie, dass CurrentAppSimulator erst vollständig initialisiert wird, wenn ReloadSimulatorAsync abgeschlossen ist. Und da ReloadSimulatorAsync eine asynchrone Methode ist, sollten Sie darauf achten, die Racebedingung der Abfrage von CurrentAppSimulator auf einem Thread zu vermeiden, während sie auf einem anderen Thread initialisiert wird. Eine Technik besteht darin, ein Flag zu verwenden, um anzugeben, dass die Initialisierung abgeschlossen ist. Eine app, die aus dem Microsoft Store installiert ist, muss CurrentApp anstelle von CurrentAppSimulator verwenden, und in diesem Fall wird ReloadSimulatorAsync nicht aufgerufen und daher gilt die erwähnte Racebedingung nicht. Entwerfen Sie aus diesem Grund Ihren Code so, dass er in beiden Fällen sowohl asynchron als auch synchron funktioniert.
Beispiele
Dieses Beispiel ist eine WindowsStoreProxy.xml Datei (UTF-16-codiert), die eine App mit einem Testmodus beschreibt, der am 19. Januar 2015 um 05:00 (UTC) abläuft.
<?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>
Das nächste Beispiel ist eine WindowsStoreProxy.xml-Datei (UTF-16-codiert), die eine app beschreibt, die gekauft wurde, ein Feature enthält, das am 19. Januar 2015 um 05:00 (UTC) abläuft und über einen konsumierbaren In-App-Kauf verfügt.
<?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
In diesem Abschnitt werden die XSD-Datei aufgeführt, die die Struktur der WindowsStoreProxy.xml Datei definiert. Gehen Sie wie folgt vor, um dieses Schema auf den XML-Editor in Visual Studio anzuwenden, wenn Sie mit Ihrer WindowsStoreProxy.xml Datei arbeiten:
- Öffnen Sie die WindowsStoreProxy.xml Datei in Visual Studio.
- Klicken Sie im XML-Menü auf "Schema erstellen". Dadurch wird eine temporäre WindowsStoreProxy.xsd-Datei basierend auf dem Inhalt der XML-Datei erstellt.
- Ersetzen Sie den Inhalt dieser XSD-Datei durch das folgende Schema.
- Speichern Sie die Datei an einem Speicherort, an dem Sie sie auf mehrere App-Projekte anwenden können.
- Wechseln Sie in Visual Studio zu Ihrer WindowsStoreProxy.xml Datei.
- Klicken Sie im XML-Menü auf "Schemas", und suchen Sie dann die Zeile in der Liste für die Datei "WindowsStoreProxy.xsd". Wenn der Speicherort für die Datei nicht der gewünschte Ist (z. B. wenn die temporäre Datei weiterhin angezeigt wird), klicken Sie auf "Hinzufügen". Navigieren Sie zur rechten Datei, und klicken Sie dann auf "OK". Diese Datei sollte nun in der Liste angezeigt werden. Stellen Sie sicher, dass in der Spalte "Verwenden " für dieses Schema ein Häkchen angezeigt wird.
Sobald Sie dies getan haben, unterliegen Bearbeitungen, die Sie an WindowsStoreProxy.xml vornehmen, dem Schema. Weitere Informationen finden Sie unter How to: Select the XML Schemas to Use.
<?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>
Element- und Attributbeschreibungen
In diesem Abschnitt werden die Elemente und Attribute in der datei WindowsStoreProxy.xml beschrieben.
Das Stammelement dieser Datei ist das CurrentApp-Element , das die aktuelle App darstellt. Dieses Element enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
ListingInformation | Ja | 1 | Enthält Daten aus dem App-Eintrag. |
LicenseInformation | Ja | 1 | Beschreibt die für diese App verfügbaren Lizenzen und ihre dauerhaften Add-Ons. |
ConsumableInformation | No | 0 oder 1 | Beschreibt die konsumierbaren Add-Ons, die für diese App verfügbar sind. |
Simulation | No | 0 oder 1 | Beschreibt, wie Aufrufe verschiedener CurrentAppSimulator-Methoden während des Tests in der App funktionieren. |
ListingInformation-Element
Dieses Element enthält Daten aus dem App-Eintrag. ListingInformation ist ein erforderliches untergeordnetes Element des CurrentApp-Elements .
ListingInformation enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
App | Ja | 1 | Stellt Daten zur App bereit. |
Produkt | No | 0 oder mehr | Beschreibt ein Add-On für die App. |
App-Element (untergeordnetes Element von ListingInformation)
Dieses Element beschreibt die App-Lizenz. Die App ist ein erforderliches untergeordnetes Element des ListingInformation-Elements .
Die App enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
AppId | Ja | 1 | Die GUID, die die App im Store identifiziert. Dies kann eine beliebige GUID für Tests sein. |
LinkUri | Ja | 1 | Der URI der Eintragsseite im Store. Dies kann ein beliebiger gültiger URI für Tests sein. |
CurrentMarket | Ja | 1 | Das Land/die Region des Kunden. |
AgeRating | Ja | 1 | Eine ganze Zahl, die die Mindestaltersfreigabe der App darstellt. Dies ist derselbe Wert, den Sie im Partner Center angeben würden, wenn Sie die App übermitteln. Die vom Store verwendeten Werte sind: 3, 7, 12 und 16. Weitere Informationen zu diesen Bewertungen finden Sie unter Altersfreigaben. |
MarketData | Ja | 1 oder mehr | Enthält Informationen zur App für ein bestimmtes Land/eine bestimmte Region. Für jedes Land/jede Region, in dem die App aufgeführt ist, müssen Sie ein MarketData-Element einschließen. |
MarketData-Element (untergeordnetes Element der App)
Dieses Element enthält Informationen zur App für ein bestimmtes Land/eine bestimmte Region. Für jedes Land/jede Region, in dem die App aufgeführt ist, müssen Sie ein MarketData-Element einschließen. MarketData ist ein erforderliches untergeordnetes Element des App-Elements .
MarketData enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
Name | Ja | 1 | Der Name der App in diesem Land/dieser Region. |
Beschreibung | Ja | 1 | Die Beschreibung der App für dieses Land/diese Region. |
Preis | Ja | 1 | Der Preis der App in diesem Land/dieser Region. |
CurrencySymbol | Ja | 1 | Das Währungssymbol, das in diesem Land/dieser Region verwendet wird. |
CurrencyCode | No | 0 oder 1 | Der in diesem Land/dieser Region verwendete Währungscode. |
MarketData weist die folgenden Attribute auf.
Attribut | Erforderlich | Beschreibung |
---|---|---|
xml:lang | Ja | Gibt das Land/die Region an, für das die Marktdateninformationen gelten. |
Product-Element (untergeordnetes Element von ListingInformation)
Dieses Element beschreibt ein Add-On für die App. Das Produkt ist ein optionales untergeordnetes Element des ListingInformation-Elements und enthält ein oder mehrere MarketData-Elemente .
Das Produkt weist die folgenden Attribute auf.
Attribut | Erforderlich | Beschreibung |
---|---|---|
ProductId | Ja | Enthält die Zeichenfolge, die von der App zum Identifizieren des Add-Ons verwendet wird. |
LicenseDuration | No | Gibt die Anzahl der Tage an, für die die Lizenz gültig ist, nachdem das Element erworben wurde. Das Ablaufdatum der neuen Lizenz, die von einem Produktkauf erstellt wurde, ist das Kaufdatum plus die Lizenzdauer. Dieses Attribut wird nur verwendet, wenn das ProductType-Attribut "Durable" lautet. Dieses Attribut wird für Verbrauchs-Add-Ons ignoriert. |
ProductType | No | Enthält einen Wert, um die Persistenz des In-App-Produkts zu identifizieren. Die unterstützten Werte sind "Durable" (Standard) und "Consumable". Für dauerhafte Typen werden zusätzliche Informationen durch ein Produktelement unter "LicenseInformation" beschrieben. Für Verbrauchstypen werden zusätzliche Informationen durch ein Produktelement unter ConsumableInformation beschrieben. |
MarketData-Element (untergeordnetes Element des Produkts)
Dieses Element enthält Informationen zum Add-On für ein bestimmtes Land/eine bestimmte Region. Für jedes Land/jede Region, in dem das Add-On aufgeführt ist, müssen Sie ein MarketData-Element einschließen. MarketData ist ein erforderliches untergeordnetes Element des Product-Elements .
MarketData enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
Name | Ja | 1 | Der Name des Add-Ons in diesem Land/dieser Region. |
Preis | Ja | 1 | Der Preis des Add-Ons in diesem Land/dieser Region. |
CurrencySymbol | Ja | 1 | Das Währungssymbol, das in diesem Land/dieser Region verwendet wird. |
CurrencyCode | No | 0 oder 1 | Der in diesem Land/dieser Region verwendete Währungscode. |
Beschreibung | No | 0 oder 1 | Die Beschreibung des Add-Ons für dieses Land/diese Region. |
Tag | No | 0 oder 1 | Die benutzerdefinierten Entwicklerdaten (auch als Tag bezeichnet) für das Add-On. |
Schlüsselwörter | No | 0 oder 1 | Enthält bis zu 10 Schlüsselwortelemente , die die Schlüsselwörter für das Add-On enthalten. |
ImageUri | No | 0 oder 1 | Der URI für das Bild im Add-On-Eintrag. |
MarketData weist die folgenden Attribute auf.
Attribut | Erforderlich | Beschreibung |
---|---|---|
xml:lang | Ja | Gibt das Land/die Region an, für das die Marktdateninformationen gelten. |
LicenseInformation-Element
Dieses Element beschreibt die für diese App verfügbaren Lizenzen und seine dauerhaften In-App-Produkte. LicenseInformation ist ein erforderliches untergeordnetes Element des CurrentApp-Elements .
LicenseInformation enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
App | Ja | 1 | Beschreibt die App-Lizenz. |
Produkt | No | 0 oder mehr | Beschreibt den Lizenzstatus eines dauerhaften Add-Ons in der App. |
In der folgenden Tabelle wird gezeigt, wie Sie einige allgemeine Bedingungen simulieren, indem Sie Werte unter den Elementen "App " und "Product " kombinieren.
Zu simulierende Bedingung | IsActive | IsTrial | Ablaufdatum |
---|---|---|---|
Vollständig lizenziert | true | false | Abwesend. Es kann tatsächlich vorhanden sein und ein zukünftiges Datum angeben, sie wird jedoch empfohlen, das Element aus der XML-Datei auszulassen. Wenn es vorhanden ist und ein Datum in der Vergangenheit angibt, wird IsActive ignoriert und zu "false" weitergeleitet. |
Im Testzeitraum | true | true | <ein Datetime in der Zukunft> Dieses Element muss vorhanden sein, da IsTrial wahr ist. Sie können eine Website besuchen, auf der die aktuelle koordinierte Weltzeit (UTC) angezeigt wird, um zu wissen, wie weit dies in Zukunft ist, um die verbleibende Testphase zu erhalten, die Sie benötigen. |
Abgelaufene Testversion | false | true | <ein Datetime in der Vergangenheit> Dieses Element muss vorhanden sein, da IsTrial wahr ist. Sie können eine Website besuchen, auf der die aktuelle koordinierte Weltzeit (UTC) angezeigt wird, um zu wissen, wann sich "die Vergangenheit" in UTC befindet. |
Ungültig | false | false | <beliebiger Wert oder ausgelassen> |
App-Element (untergeordnetes Element von LicenseInformation)
Dieses Element beschreibt die App-Lizenz. Die App ist ein erforderliches untergeordnetes Element des LicenseInformation-Elements .
Die App enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
IsActive | Ja | 1 | Beschreibt den aktuellen Lizenzstatus dieser App. Der Wert true gibt an, dass die Lizenz gültig ist; false gibt eine ungültige Lizenz an. Normalerweise ist dieser Wert wahr, unabhängig davon, ob die App über einen Testmodus verfügt oder nicht. Legen Sie diesen Wert auf "false " fest, um zu testen, wie sich Ihre App verhält, wenn sie über eine ungültige Lizenz verfügt. |
IsTrial | Ja | 1 | Beschreibt den aktuellen Teststatus dieser App. Der Wert "true " gibt an, dass die App während des Testzeitraums verwendet wird. "false " gibt an, dass sich die App nicht in einer Testversion befindet, entweder weil die App gekauft wurde oder der Testzeitraum abgelaufen ist. |
ExpirationDate | No | 0 oder 1 | Das Datum, an dem der Testzeitraum für diese App abläuft, in koordinierter Weltzeit (COORDINATED Universal Time, UTC). Das Datum muss ausgedrückt werden als: jjjj-mm-ddThh:mm:ss.ssZ. Beispielsweise würde 05:00 Am 19. Januar 2015 als 2015-01-19T05:00:00.00Z angegeben. Dieses Element ist erforderlich, wenn IsTrial wahr ist. Andernfalls ist sie nicht erforderlich. |
Product-Element (untergeordnetes Element von LicenseInformation)
Dieses Element beschreibt den Lizenzstatus eines dauerhaften Add-Ons in der App. Das Produkt ist ein optionales untergeordnetes Element des LicenseInformation-Elements .
Das Produkt enthält die folgenden untergeordneten Elemente.
Element | Erforderlich | Menge | Beschreibung |
---|---|---|---|
IsActive | Ja | 1 | Beschreibt den aktuellen Lizenzstatus dieses Add-Ons. Der Wert true gibt an, dass das Add-On verwendet werden kann; false gibt an, dass das Add-On nicht verwendet werden kann oder nicht gekauft wurde. |
ExpirationDate | No | 0 oder 1 | Das Datum, an dem das Add-On abläuft, in koordinierter Weltzeit (UTC). Das Datum muss ausgedrückt werden als: jjjj-mm-ddThh:mm:ss.ssZ. Beispielsweise würde 05:00 Am 19. Januar 2015 als 2015-01-19T05:00:00.00Z angegeben. Wenn dieses Element vorhanden ist, weist das Add-On ein Ablaufdatum auf. Wenn es nicht vorhanden ist, läuft das Add-On nicht ab. |
Das Produkt weist die folgenden Attribute auf.
Attribut | Erforderlich | Beschreibung |
---|---|---|
ProductId | Ja | Enthält die Zeichenfolge, die von der App zum Identifizieren des Add-Ons verwendet wird. |
OfferId | No | Enthält die Zeichenfolge, die von der App verwendet wird, um die Kategorie zu identifizieren, zu der das Add-On gehört. Dies bietet Unterstützung für große Elementkataloge, wie unter "Verwalten eines großen Katalogs von In-App-Produkten" beschrieben. |
Simulationselement
Dieses Element beschreibt, wie Aufrufe verschiedener CurrentAppSimulator-Methoden während des Tests in der App funktionieren. Simulation ist ein optionales untergeordnetes Element des CurrentApp-Elements und enthält null oder mehr DefaultResponse-Elemente .
Die Simulation weist die folgenden Attribute auf.
Attribut | Erforderlich | Beschreibung |
---|---|---|
SimulationMode | No | Werte können interaktiv oder automatisch sein. Wenn dieses Attribut auf "Automatisch" festgelegt ist, geben die Methoden automatisch die angegebenen HRESULT-Fehlercodes zurück. Dies kann verwendet werden, wenn automatisierte Testfälle ausgeführt werden. |
DefaultResponse-Element
Dieses Element beschreibt den Standardfehlercode, der von einer CurrentAppSimulator-Methode zurückgegeben wird. DefaultResponse ist ein optionales untergeordnetes Element des Simulationselements .
DefaultResponse weist die folgenden Attribute auf .
Attribut | Erforderlich | Beschreibung |
---|---|---|
MethodName | Ja | Weisen Sie dieses Attribut einem der Enumerationswerte zu, die für den StoreMethodName-Typ im Schema angezeigt werden. Jeder dieser Enumerationswerte stellt eine CurrentAppSimulator-Methode dar, für die Sie während des Tests einen Fehlercode-Rückgabewert in Ihrer App simulieren möchten. Beispielsweise gibt der Wert RequestAppPurchaseAsync_GetResult an, dass Sie den Fehlercode-Rückgabewert der RequestAppPurchaseAsync-Methode simulieren möchten. |
HResult | Ja | Weisen Sie dieses Attribut einem der Enumerationswerte zu, die für den ResponseCodes-Typ im Schema angezeigt werden. Jeder dieser Enumerationswerte stellt den Fehlercode dar, den Sie für die Methode zurückgeben möchten, die dem MethodName-Attribut für dieses DefaultResponse-Element zugewiesen ist. |
ConsumableInformation-Element
Dieses Element beschreibt die für diese App verfügbaren Verbrauchs-Add-Ons. ConsumableInformation ist ein optionales untergeordnetes Element des CurrentApp-Elements und kann null oder mehr Product-Elemente enthalten.
Product-Element (untergeordnetes Element von ConsumableInformation)
Dieses Element beschreibt ein Konsum-Add-On. Das Produkt ist ein optionales untergeordnetes Element des ConsumableInformation-Elements .
Das Produkt weist die folgenden Attribute auf.
Attribut | Erforderlich | Beschreibung |
---|---|---|
ProductId | Ja | Enthält die Zeichenfolge, die von der App zum Identifizieren des konsumierbaren Add-Ons verwendet wird. |
TransactionId | Ja | Enthält eine GUID (als Zeichenfolge), die von der App verwendet wird, um die Kauftransaktion eines Verbrauchsartikels über den Erfüllungsprozess nachzuverfolgen. Weitere Informationen finden Sie unter Aktivieren von In-App-Produktkäufen. |
Status | Ja | Enthält die Zeichenfolge, die von der App verwendet wird, um den Erfüllungsstatus eines Verbrauchsartikels anzugeben. Werte können aktiv, PurchaseReverted, PurchasePending oder ServerError sein. |
OfferId | No | Enthält die Zeichenfolge, die von der App verwendet wird, um die Kategorie zu identifizieren, zu der der Verbrauchsartikel gehört. Dies bietet Unterstützung für große Elementkataloge, wie unter "Verwalten eines großen Katalogs von In-App-Produkten" beschrieben. |