In-App-Käufe und Testversionen mit dem Windows.ApplicationModel.Store-Namespace

Sie können Mitglieder des Windows.ApplicationModel.Store verwenden, um Ihrer Universal Windows Platform (UWP)-App In-App-Käufe und Testfunktionen hinzuzufügen und die Monetarisierung Ihrer App zu unterstützen. Diese APIs ermöglichen auch den Zugriff auf die Lizenzinformationen für Ihre App.

Die Artikel in diesem Abschnitt enthalten ausführliche Anleitungen und Codebeispiele für die Verwendung der Mitgliedern des Windows.ApplicationModel.Store-Namespace für verschiedene häufige Szenarien. Eine Übersicht über die Basiskonzepte im Zusammenhang mit In-App-Käufen in UWP-Apps finden Sie unter In-App-Käufe und Testversionen. Ein vollständiges Beispiel, das zeigt, wie Sie Testversionen und In-App-Käufe mithilfe des Windows.ApplicationModel.Store-Namespace implementieren, finden Sie im Store-Beispiel.

Wichtig

Der Windows.ApplicationModel.Store-Namespace wird nicht mehr mit neuen Features aktualisiert. Wenn Ihr Projekt Windows 10 Anniversary Edition (10.0; Build 14393) oder eine höhere Version in Visual Studio (d. h. Sie zielen auf Windows 10 Version 1607 oder höher ab), wird empfohlen, stattdessen den Windows.Services.Store-Namespace zu verwenden. Weitere Informationen finden Sie unter In-App-Käufe und Testversionen. Der Windows.ApplicationModel.Store-Namespace wird nicht in Windows-Desktopanwendungen unterstützt, die die Desktop-Brücke verwenden, oder in Apps oder Spielen, die eine Entwicklungssandbox im Partner Center verwenden (dies gilt z. B. für alle Spiele, die in Xbox Live integriert sind). 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

Den Haupteinstiegspunkt in den Windows.ApplicationModel.Store-Namespace stellt die Klasse CurrentApp dar. Diese Klasse stellt statische Eigenschaften und Methoden bereit, mit deren Hilfe Sie Informationen für die aktuelle App und ihre verfügbaren Add-Ons abrufen, Lizenzinformationen für die aktuelle App oder deren 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, sodass Sie über ein Entwicklerkonto verfügen und die App im Store veröffentlicht werden muss, bevor Sie diese Klasse erfolgreich in Ihrer App verwenden können. Vor dem Übermitteln Ihrer App an den Store können Sie den 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 CurrentAppSimulator-Instanzen durch CurrentApp ersetzen. Ihre App wird nicht zertifiziert, wenn sie CurrentAppSimulator verwendet.

Wenn CurrentAppSimulator verwendet wird, wird der ursprünglichen Status der Lizenzierung Ihrer App und In-App-Produkte in einer lokalen Datei mit dem Namen WindowsStoreProxy.xml auf Ihrem Entwicklungscomputer beschrieben. Weitere Informationen zu dieser Datei finden Sie unter Verwenden der Datei „WindowsStoreProxy.xml“ mit CurrentAppSimulator.

Weitere Informationen zu den 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 Durch einen kostenlose, zeitlich begrenzte Testversion Ihrer App mit eingeschränkten Features können Sie Ihre Kunden motivieren, auf die Vollversion Ihrer App zu aktualisieren.
Unterstützen des Kaufs von In-App-Produkten Sie können unabhängig davon, ob Ihre App kostenlos oder kostenpflichtig ist, Inhalte, andere Apps oder neue App-Funktionen (wie das Freischalten des nächsten Levels eines Spiels) direkt in der App verkaufen. Hier zeigen wir Ihnen, wie Sie diese Produkte in Ihrer App aktivieren können.
Käufe von konsumierbaren In-App-Produkten aktivieren Sie können In-App-Käufe von Endverbraucherprodukten – Artikel, die gekauft, verwendet und wieder gekauft werden können – über die Store-Handelsplattform anbieten, um Kunden beim Kauf Stabilität und Zuverlässigkeit zu bieten. Dies ist besonders nützlich für Dinge wie spielinterne Währungen (Gold, Münzen usw.), die gekauft und dann zum Erwerben 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 enthält, können Sie optional das in diesem Thema beschriebene Verfahren zum Verwalten des Katalogs ausführen.
Überprüfen von Produktkäufen anhand von Belegen Jede Microsoft Store-Transaktion, die zu einem erfolgreichen Produktkauf führt, kann optional einen Transaktionsbeleg zurückgeben, der dem Kunden Informationen über das aufgeführte Produkt und die Geldkosten enthält. Der Zugriff auf diese Informationen unterstützt Szenarien, in denen Ihre App überprüfen muss, ob ein Benutzer Ihre App erworben oder In-App-Produktkäufe im Microsoft Store getätigt hat.

Verwenden der Datei „WindowsStoreProxy.xml“ mit CurrentAppSimulator

Wenn CurrentAppSimulator verwendet wird, wird der ursprünglichen Status der Lizenzierung Ihrer App und In-App-Produkte in einer lokalen Datei mit dem Namen WindowsStoreProxy.xml auf Ihrem Entwicklungscomputer beschrieben. Durch CurrentAppSimulator-Methoden, die den Status der App verändern, beispielsweise durch den Kauf einer Lizenz oder die Verarbeitung eines In-App-Kaufs, wird lediglich der Status des CurrentAppSimulator-Objekts im Speicher aktualisiert. Der Inhalt von WindowsStoreProxy.xml wird nicht geändert. Wenn die App erneut gestartet wird, wird der Lizenzstatus auf den Status zurückgesetzt, der in WindowsStoreProxy.xml beschrieben ist.

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.

Auch wenn Sie die Werte in dieser Datei ändern können, wird empfohlen, dass Sie eine eigene WindowsStoreProxy.xml-Datei (in einem Datenordner des Visual Studio-Projekts) zur Verwendung durch CurrentAppSimulator erstellen. Rufen Sie ReloadSimulatorAsync auf, um Ihre Datei zu laden, wenn Sie die Transaktion simulieren. Wenn Sie ReloadSimulatorAsync nicht aufrufen, um Ihre eigene WindowsStoreProxy.xml-Datei zu laden, erstellt/lädt CurrentAppSimulator die standardmäßige WindowsStoreProxy.xml-Datei (überschreibt sie jedoch nicht).

Hinweis

Beachten Sie, dass CurrentAppSimulator erst vollständig initialisiert wird, wenn ReloadSimulatorAsync abgeschlossen ist. Und da ReloadSimulatorAsync eine asynchrone Methode ist, müssen Sie darauf achten, eine Racebedingung zu vermeiden, in der CurrentAppSimulator in einem Thread abgefragt und gleichzeitig in einem anderen Thread initialisiert wird. Eine Möglichkeit besteht darin, ein Flag verwenden, um anzugeben, dass die Initialisierung abgeschlossen ist. Eine App, die aus dem Microsoft Store installiert wird, muss CurrentApp anstelle von CurrentAppSimulator verwenden, und in diesem Fall wird ReloadSimulatorAsync nicht aufgerufen, und daher gilt die soeben erwähnte Racebedingung nicht. Aus diesem Grund entwerfen Sie Ihren Code so, dass er in beiden Fällen sowohl asynchron als auch synchron funktioniert.

Beispiele

In diesem Beispiel wird eine WindowsStoreProxy.xml-Datei (UTF-16-codiert) gezeigt, die eine App mit einem Testmodus beschreibt, der am 19. Januar 2015 um 05:00 Uhr (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>

Im nächsten Beispiel wird eine WindowsStoreProxy.xml-Datei (UTF-16-codiert) gezeigt, die eine App beschreibt, die gekauft wurde, ein Feature besitzt, 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 wird die XSD-Datei aufgelistet, die die Struktur der WindowsStoreProxy.xml-Datei definiert. Um dieses Schema beim Arbeiten mit Ihrer WindowsStoreProxy.xml-Datei auf den XML-Editor in Visual Studio anzuwenden, führen Sie folgende Schritte aus:

  1. Öffnen Sie die WindowsStoreProxy.xml-Datei in Microsoft Visual Studio.
  2. Klicken Sie im Menü XML auf Schema erstellen. Hierdurch wird eine temporäre WindowsStoreProxy.xsd-Datei auf Grundlage des Inhalts der XML-Datei erstellt.
  3. Ersetzen Sie den Inhalt dieser XSD-Datei durch das folgende Schema.
  4. Speichern Sie die Datei an einem Ort, an dem Sie sie auf mehrere App-Projekte anwenden können.
  5. Wechseln Sie zur WindowsStoreProxy.xml-Datei in Visual Studio.
  6. Klicken Sie im Menü XML auf Schemas, und suchen Sie die Zeile in der Liste für die WindowsStoreProxy.xsd-Datei. Wenn der Speicherort der Datei nicht der gewünschte ist (wenn beispielsweise die temporäre Datei weiterhin angezeigt wird), klicken Sie auf Hinzufügen. Navigieren Sie zur richtigen Datei, und klicken Sie dann auf OK. Nun sollte Ihnen diese Datei in der Liste angezeigt werden. Stellen Sie sicher, dass in der Spalte Verwenden für dieses Schema ein Häkchen angezeigt wird.

Anschließend unterliegen Ihre Bearbeitungen der WindowsStoreProxy.xml-Datei dem Schema. Weitere Informationen finden Sie unter So wählen Sie die zu verwendenden XML-Schemas aus.

<?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 WindowsStoreProxy.xml-Datei 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 Lizenzen, die für diese App verfügbar sind, und ihre dauerhaften Add-Ons.
ConsumableInformation Nein 0 oder 1 Beschreibt die konsumierbaren Add-Ons, die für diese App verfügbar sind.
Simulation Nein 0 oder 1 Beschreibt, wie Aufrufe verschiedener CurrentAppSimulator-Methoden während der Testphase 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 Nein 0 oder mehr Beschreibt ein Add-On für die App.

App-Element (untergeordnetes Element von ListingInformation)

Dieses Element beschreibt die App-Lizenz. App ist ein erforderliches untergeordnetes Element des ListingInformation-Elements.

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 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 Mindestens 1 Enthält Informationen über die App für ein bestimmtes Land oder eine bestimmte Region. Für jedes Land/jede Region, in denen die App eingetragen ist, müssen Sie ein MarketData-Element einschließen.

MarketData-Element (untergeordnetes Element von App)

Dieses Element stellt Informationen zur App für ein bestimmtes Land oder eine bestimmte Region bereit. Für jedes Land/jede Region, in denen die App eingetragen 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 Nein 0 oder 1 Der Währungscode, der in diesem Land/dieser Region verwendet wird.

MarketData hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
xml:lang Ja Gibt das Land/die Region an, für das/die die Marktdateninformationen gelten.

Produktelement (untergeordnetes Element von ListingInformation.)

Dieses Element beschreibt ein Add-On für die App. Product ist ein optionales untergeordnetes Element des ListingInformation -Elements und enthält mindestens ein MarketData-Element.

Product hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
ProductId Ja Enthält die Zeichenfolge, die von der App zur Identifizierung des Add-Ons verwendet wird.
LicenseDuration Nein Gibt die Anzahl der Tage an, für die die Lizenz gültig sein wird, nachdem der Artikel gekauft wurde. Das Ablaufdatum der neuen, durch einen Produktkauf erstellten Lizenz ist das Kaufdatum plus Lizenzdauer. Dieses Attribut wird nur verwendet, wenn das ProductType-Attribut Durable ist. Dieses Attribut wird für konsumierbare Add-Ons ignoriert.
ProductType Nein Enthält einen Wert für die Identifizierung der Persistenz des In-App-Produkts. Die unterstützten Werte sind Durable (Standard) und Consumable. Zusätzliche Informationen zu Typen dauerhafter Add-Ons werden durch ein Product-Element unter LicenseInformation beschrieben. Zusätzliche Informationen zu Typen konsumierbarer Add-Ons werden durch ein Product-Element unter ConsumableInformation beschrieben.

MarketData-Element (untergeordnetes Element von Product)

Dieses Element stellt Informationen zum Add-On für ein bestimmtes Land oder eine bestimmte Region bereit. Für jedes Land/jede Region, in denen das Add-On eingetragen 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 Nein 0 oder 1 Der Währungscode, der in diesem Land/dieser Region verwendet wird.
Beschreibung Nein 0 oder 1 Die Beschreibung des Add-Ons für dieses Land/diese Region.
Tag Nein 0 oder 1 Die benutzerdefinierten Daten (auch als „Tag“ bezeichnet) für das Add-On.
Schlüsselwörter Nein 0 oder 1 Enthält bis zu 10 Keyword-Elemente, die die Schlüsselwörter für das Add-On enthalten.
ImageUri Nein 0 oder 1 Der URI für das Bild im Add-On-Eintrag.

MarketData hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
xml:lang Ja Gibt das Land/die Region an, für das/die die Marktdateninformationen gelten.

LicenseInformation-Element

Dieses Element beschreibt die Lizenzen, die für diese App und deren dauerhafte In-App-Produkte verfügbar sind. 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 Nein 0 oder mehr Beschreibt den Lizenzstatus eines dauerhaften Add-Ons in der App.

Die folgende Tabelle zeigt, wie Sie einige häufige Bedingungen simulieren, indem Sie Werte unter den Elementen App und Product kombinieren.

Zu simulierende Bedingung IsActive IsTrial ExpirationDate
Vollständig lizenziert true false Nicht vorhanden. Es kann vorhanden sein und ein späteres Datum angeben. Es wird jedoch empfohlen, das Element nicht in die XML-Datei einzuschließen. Wenn es vorhanden ist und ein Datum in der Vergangenheit angibt, wird IsActive ignoriert und als „false“ bewertet.
Im Testzeitraum true true <ein datetime-Element in der Zukunft> Dieses Element muss vorhanden sein, da IsTrial true ist. Sie können eine Website aufrufen, die die aktuelle koordinierte Weltzeit (UTC) anzeigt, um festzustellen, auf wie weit in der Zukunft dies festgelegt werden muss, um den gewünschten verbleibenden Testzeitraum zu erhalten.
Abgelaufene Testversion false true <ein datetime-Element in der Vergangenheit> Dieses Element muss vorhanden sein, da IsTrial true ist. Sie können eine Website aufrufen, die die aktuelle koordinierte Weltzeit (UTC) anzeigt, um festzustellen, was in UTC Vergangenheit ist.
Ungültig false false <Jeder Wert oder ausgelassen>

App-Element (untergeordnetes Element von LicenseInformation)

Dieses Element beschreibt die App-Lizenz. App ist ein erforderliches untergeordnetes Element des LicenseInformation-Elements.

App enthält die folgenden untergeordneten Elemente.

Element Erforderlich Menge BESCHREIBUNG
IsActive Ja 1 Beschreibt den aktuellen Lizenzstatus der App. Der Wert true gibt an, dass die Lizenz gültig ist. Der Wert false gibt an, dass die Lizenz ungültig ist. Normalerweise lautet dieser Wert true, unabhängig davon, ob die App einen Testmodus hat oder nicht. Legen Sie diesen Wert auf false fest, um zu testen, wie sich Ihre App verhält, wenn die Lizenz ungültig ist.
IsTrial Ja 1 Beschreibt den aktuellen Testversionsstatus der App. Der Wert true gibt an, dass die App während des Testzeitraums verwendet wird. Der Wert false gibt an, dass die App keine Testversion ist, entweder weil die App gekauft wurde oder weil der Testzeitraum abgelaufen ist.
ExpirationDate Nein 0 oder 1 Das Datum, an dem der Testzeitraum für diese App abläuft, angegeben in der koordinierten Weltzeit (UTC). Das Datum muss ausgedrückt werden als: yyyy-mm-ddThh:mm:ss.ssZ. Beispielsweise würde 05:00 Uhr am 19. Januar 2015 als 2015-01-19T05:00:00.00Z angegeben. Dieses Element ist erforderlich, wenn IsTrialtrue ist. Andernfalls ist es nicht erforderlich.

Product-Element (untergeordnetes Element von LicenseInformation.)

Dieses Element beschreibt den Lizenzstatus eines dauerhaften Add-Ons in der App. Product ist ein optionales untergeordnetes Element des LicenseInformation-Elements.

Product enthält die folgenden untergeordneten Elemente.

Element Erforderlich Menge BESCHREIBUNG
IsActive Ja 1 Beschreibt den aktuellen Lizenzstatus des Add-Ons. Der Wert true gibt an, dass das Add-On verwendet werden kann. Der Wert false gibt an, dass das Add-On nicht verwendet werden kann oder nicht gekauft wurde.
ExpirationDate Nein 0 oder 1 Das Datum, an dem das Add-On abläuft, angegeben in der koordinierten Weltzeit (UTC). Das Datum muss ausgedrückt werden als: yyyy-mm-ddThh:mm:ss.ssZ. Beispielsweise würde 05:00 Uhr am 19. Januar 2015 als 2015-01-19T05:00:00.00Z angegeben. Wenn dieses Element vorhanden ist, hat das Add-On ein Ablaufdatum. Wenn es nicht vorhanden ist, läuft das Add-On nicht ab.

Product hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
ProductId Ja Enthält die Zeichenfolge, die von der App zur Identifizierung des Add-Ons verwendet wird.
OfferId Nein Enthält die Zeichenfolge, die von der App zur Identifizierung der Kategorie verwendet wird, zu der das Add-On gehört. Dies stellt Unterstützung für große Artikelkataloge bereit, wie unter Verwalten eines großen Katalogs mit In-App-Produkten beschrieben.

Simulation-Element

Dieses Element beschreibt, wie Aufrufe verschiedener CurrentAppSimulator-Methoden während der Testphase in der App funktionieren. Simulation ist ein optionales untergeordnetes Element des CurrentApp-Elements und enthält keine oder mehr DefaultResponse-Elemente.

Simulation hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
SimulationMode Nein Werte können Interactive oder Automatic sein. Wenn dieses Attribut auf Automatic festgelegt ist, geben die Methoden automatisch die angegebenen HRESULT-Fehlercodes zurück. Dies kann während der Ausführung automatisierter Testfälle verwendet werden.

DefaultResponse-Element

Dieses Element beschreibt den Standardfehlercode, der von einer CurrentAppSimulator-Methode zurückgegeben wird. DefaultResponse ist ein optionales untergeordnetes Element des Simulation-Elements.

DefaultResponse hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
MethodName Ja Weisen Sie dieses Attribut einem der Enumerationswerte für den Typ StoreMethodName im Schema zu. Jede dieser Enumerationswerte stellt eine CurrentAppSimulator-Methode dar, für die Sie während der Testphase in Ihrer App einen Fehlercode-Rückgabewert 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 für den Typ ResponseCodes im Schema zu. Jeder dieser Enumerationswerte stellt den Fehlercode dar, den Sie für die Methode zurückgeben möchten, die Sie dem MethodName-Attribut für dieses DefaultResponse-Element zugewiesen haben.

ConsumableInformation-Element

Dieses Element beschreibt die konsumierbaren Add-Ons, die für diese App verfügbar sind. ConsumableInformation ist ein optionales untergeordnetes Element des CurrentApp-Elements und kann keine oder mehr Product-Elemente enthalten.

Product-Element (untergeordnetes Element von ConsumableInformation)

Dieses Element beschreibt ein konsumierbares Add-On. Product ist ein optionales untergeordnetes Element des ConsumableInformation-Elements.

Product hat die folgenden Attribute.

attribute Erforderlich BESCHREIBUNG
ProductId Ja Enthält die Zeichenfolge, die von der App zur Identifizierung des konsumierbaren Add-Ons verwendet wird.
TransactionId Ja Enthält eine GUID (als Zeichenfolge), die von der App verwendet wird, um die Kauftransaktion für ein konsumierbares Add-On während der Ausführung nachzuverfolgen. Weitere Informationen finden Sie unter Käufe von konsumierbaren In-App-Produkten aktivieren.
Status Ja Enthält die Zeichenfolge, die von der App verwendet wird, um den Ausführungsstatus eines konsumierbaren Add-Ons anzugeben. Werte können Active, PurchaseReverted, PurchasePending oder ServerError sein.
OfferId Nein Enthält die Zeichenfolge, die von der App zur Identifizierung der Kategorie verwendet wird, zu der das konsumierbare Add-On gehört. Dies stellt Unterstützung für große Artikelkataloge bereit, wie unter Verwalten eines großen Katalogs mit In-App-Produkten beschrieben.