Pembelian dan uji coba dalam aplikasi menggunakan namespace Windows.ApplicationModel.Store

Anda dapat menggunakan anggota di namespace Windows.ApplicationModel.Store untuk menambahkan fungsionalitas pembelian dan uji coba dalam aplikasi ke aplikasi Platform Windows Universal (UWP) Anda untuk membantu memonetisasi aplikasi Anda. API ini juga menyediakan akses ke info lisensi untuk aplikasi Anda.

Artikel di bagian ini memberikan panduan mendalam dan contoh kode untuk menggunakan anggota di namespace Windows.ApplicationModel.Store untuk beberapa skenario umum. Untuk gambaran umum konsep dasar yang terkait dengan pembelian dalam aplikasi di aplikasi UWP, lihat Pembelian dan uji coba dalam aplikasi. Untuk sampel lengkap yang menunjukkan cara menerapkan uji coba dan pembelian dalam aplikasi menggunakan namespace Windows.ApplicationModel.Store , lihat sampel Store.

Penting

Namespace Windows.ApplicationModel.Store tidak lagi diperbarui dengan fitur baru. Jika proyek Anda menargetkan Windows 10 Anniversary Edition (10.0; Build 14393) atau rilis yang lebih baru di Visual Studio (yaitu, Anda menargetkan Windows 10, versi 1607, atau yang lebih baru), kami sarankan Anda menggunakan namespace Windows.Services.Store sebagai gantinya. Untuk informasi selengkapnya, lihat Pembelian dan uji coba dalam aplikasi. Namespace Windows.ApplicationModel.Store tidak didukung di aplikasi desktop Windows yang menggunakan Desktop Bridge atau di aplikasi atau game yang menggunakan kotak pasir pengembangan di Pusat Mitra (misalnya, ini adalah kasus untuk setiap game yang terintegrasi dengan Xbox Live). Produk-produk ini harus menggunakan namespace Windows.Services.Store untuk mengimplementasikan pembelian dan uji coba dalam aplikasi.

Mulai menggunakan kelas CurrentApp dan CurrentAppSimulator

Titik masuk utama ke namespace Windows.ApplicationModel.Store adalah kelas CurrentApp . Kelas ini menyediakan properti statis dan metode yang dapat Anda gunakan untuk mendapatkan info untuk aplikasi saat ini dan add-on yang tersedia, mendapatkan info lisensi untuk aplikasi saat ini atau add-on-nya, membeli aplikasi atau add-on untuk pengguna saat ini, dan melakukan tugas lain.

Kelas CurrentApp memperoleh datanya dari Microsoft Store, jadi Anda harus memiliki akun pengembang dan aplikasi harus diterbitkan di Store sebelum Anda berhasil menggunakan kelas ini di aplikasi Anda. Sebelum mengirimkan aplikasi ke Store, Anda dapat menguji kode dengan versi simulasi kelas ini yang disebut CurrentAppSimulator. Setelah menguji aplikasi, dan sebelum mengirimkannya ke Microsoft Store, Anda harus mengganti instans CurrentAppSimulator dengan CurrentApp. Aplikasi Anda akan gagal sertifikasi jika menggunakan CurrentAppSimulator.

Saat CurrentAppSimulator digunakan, status awal lisensi dan produk dalam aplikasi Anda dijelaskan dalam file lokal di komputer pengembangan Anda bernama WindowsStoreProxy.xml. Untuk informasi selengkapnya tentang file ini, lihat Menggunakan file WindowsStoreProxy.xml dengan CurrentAppSimulator.

Untuk informasi selengkapnya tentang tugas umum yang bisa Anda lakukan menggunakan CurrentApp dan CurrentAppSimulator, lihat artikel berikut ini.

Topik Deskripsi
Mengecualikan atau membatasi fitur dalam versi uji coba Jika Anda memungkinkan pelanggan menggunakan aplikasi secara gratis selama periode uji coba, Anda dapat menarik pelanggan untuk meningkatkan ke versi lengkap aplikasi Anda dengan mengecualikan atau membatasi beberapa fitur selama periode uji coba.
Mengaktifkan pembelian produk dalam aplikasi Baik aplikasi Anda gratis atau tidak, Anda dapat menjual konten, aplikasi lain, atau fungsionalitas aplikasi baru (seperti membuka kunci tingkat permainan berikutnya) dari langsung dalam aplikasi. Di sini kami menunjukkan kepada Anda cara mengaktifkan produk-produk ini di aplikasi Anda.
Mengaktifkan pembelian produk dalam aplikasi yang dapat dikonsumsi Menawarkan produk dalam aplikasi yang dapat dikonsumsi—item yang dapat dibeli, digunakan, dan dibeli lagi—melalui platform perdagangan Store untuk memberi pelanggan Anda pengalaman pembelian yang kuat dan andal. Ini sangat berguna untuk hal-hal seperti mata uang dalam game (emas, koin, dll.) yang dapat dibeli dan kemudian digunakan untuk membeli power-up tertentu.
Mengelola katalog besar produk dalam aplikasi Jika aplikasi Anda menawarkan katalog produk dalam aplikasi yang besar, Anda dapat secara opsional mengikuti proses yang dijelaskan dalam topik ini untuk membantu mengelola katalog Anda.
Menggunakan tanda terima untuk memverifikasi pembelian produk Setiap transaksi Microsoft Store yang menghasilkan pembelian produk yang berhasil dapat secara opsional mengembalikan tanda terima transaksi yang memberikan informasi tentang produk yang tercantum dan biaya moneter kepada pelanggan. Memiliki akses ke informasi ini mendukung skenario di mana aplikasi Anda perlu memverifikasi bahwa pengguna membeli aplikasi Anda, atau telah melakukan pembelian produk dalam aplikasi dari Microsoft Store.

Menggunakan file WindowsStoreProxy.xml dengan CurrentAppSimulator

Saat CurrentAppSimulator digunakan, status awal lisensi dan produk dalam aplikasi Anda dijelaskan dalam file lokal di komputer pengembangan Anda bernama WindowsStoreProxy.xml. Metode CurrentAppSimulator yang mengubah status aplikasi, misalnya dengan membeli lisensi atau menangani pembelian dalam aplikasi, hanya memperbarui status objek CurrentAppSimulator dalam memori. Isi WindowsStoreProxy.xml tidak diubah. Saat aplikasi dimulai lagi, status lisensi kembali ke apa yang dijelaskan dalam WindowsStoreProxy.xml.

File WindowsStoreProxy.xml dibuat secara default di lokasi berikut: %UserProfile%\AppData\Local\Packages\<app package folder>\LocalState\Microsoft\Windows Store\ApiData. Anda dapat mengedit file ini untuk menentukan skenario yang ingin Anda simulasikan di properti CurrentAppSimulator .

Meskipun Anda dapat mengubah nilai dalam file ini, kami sarankan Anda membuat file WindowsStoreProxy.xml Anda sendiri (di folder data proyek Visual Studio Anda) agar CurrentAppSimulator dapat digunakan sebagai gantinya. Saat mensimulasikan transaksi, panggil ReloadSimulatorAsync untuk memuat file Anda. Jika Anda tidak memanggil ReloadSimulatorAsync untuk memuat file WindowsStoreProxy.xml Anda sendiri, CurrentAppSimulator akan membuat/memuat (tetapi tidak menimpa) file WindowsStoreProxy.xml default.

Catatan

Ketahuilah bahwa CurrentAppSimulator tidak sepenuhnya diinisialisasi sampai ReloadSimulatorAsync selesai. Dan, karena ReloadSimulatorAsync adalah metode asinkron, perawatan harus diambil untuk menghindari kondisi persaingan kueri CurrentAppSimulator pada satu utas saat sedang diinisialisasi di utas lain. Salah satu tekniknya adalah menggunakan bendera untuk menunjukkan bahwa inisialisasi selesai. Aplikasi yang diinstal dari Microsoft Store harus menggunakan CurrentApp alih-alih CurrentAppSimulator, dan dalam hal ini ReloadSimulatorAsync tidak dipanggil dan oleh karena itu kondisi balapan yang baru saja disebutkan tidak berlaku. Untuk alasan ini, rancang kode Anda sehingga akan berfungsi dalam kedua kasus, baik secara asinkron maupun sinkron.

Contoh

Contoh ini adalah file WindowsStoreProxy.xml (dikodekan UTF-16) yang menjelaskan aplikasi dengan mode uji coba yang kedaluwarsa pada 05:00 (UTC) pada 19 Jan 2015.

<?xml version="1.0" encoding="UTF-16"?>
<CurrentApp>
  <ListingInformation>
    <App>
      <AppId>2B14D306-D8F8-4066-A45B-0FB3464C67F2</AppId>
      <LinkUri>http://apps.windows.microsoft.com/app/2B14D306-D8F8-4066-A45B-0FB3464C67F2</LinkUri>
      <CurrentMarket>en-US</CurrentMarket>
      <AgeRating>3</AgeRating>
      <MarketData xml:lang="en-us">
        <Name>App with a trial license</Name>
        <Description>Sample app for demonstrating trial license management</Description>
        <Price>4.99</Price>
        <CurrencySymbol>$</CurrencySymbol>
      </MarketData>
    </App>
  </ListingInformation>
  <LicenseInformation>
    <App>
      <IsActive>true</IsActive>
      <IsTrial>true</IsTrial>
      <ExpirationDate>2015-01-19T05:00:00.00Z</ExpirationDate>
    </App>
  </LicenseInformation>
  <Simulation SimulationMode="Automatic">
    <DefaultResponse MethodName="LoadListingInformationAsync_GetResult" HResult="E_FAIL"/>
  </Simulation>
</CurrentApp>

Contoh berikutnya adalah file WindowsStoreProxy.xml (dikodekan UTF-16) yang menjelaskan aplikasi yang telah dibeli, memiliki fitur yang kedaluwarsa pada pukul 05.00 (UTC) pada 19 Januari 2015, dan memiliki pembelian dalam aplikasi yang dapat dikonsumsi.

<?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>

Skema

Bagian ini mencantumkan file XSD yang menentukan struktur file WindowsStoreProxy.xml. Untuk menerapkan skema ini ke editor XML di Visual Studio saat bekerja dengan file WindowsStoreProxy.xml Anda, lakukan hal berikut:

  1. Buka file WindowsStoreProxy.xml di Visual Studio.
  2. Pada menu XML , klik Buat Skema. Ini akan membuat file WindowsStoreProxy.xsd sementara berdasarkan konten file XML.
  3. Ganti konten file .xsd tersebut dengan skema di bawah ini.
  4. Simpan file ke lokasi tempat Anda dapat menerapkannya ke beberapa proyek aplikasi.
  5. Beralih ke file WindowsStoreProxy.xml Anda di Visual Studio.
  6. Pada menu XML , klik Skema, lalu temukan baris dalam daftar untuk file WindowsStoreProxy.xsd. Jika lokasi untuk file bukan yang Anda inginkan (misalnya, jika file sementara masih ditampilkan), klik Tambahkan. Navigasikan ke file yang tepat, lalu klik OK. Anda sekarang akan melihat file tersebut dalam daftar. Pastikan tanda centang muncul di kolom Gunakan untuk skema tersebut.

Setelah Anda melakukan ini, pengeditan yang Anda lakukan pada WindowsStoreProxy.xml akan tunduk pada skema. Untuk informasi selengkapnya, lihat Cara: Pilih Skema XML yang akan Digunakan.

<?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>

Deskripsi elemen dan atribut

Bagian ini menjelaskan elemen dan atribut dalam file WindowsStoreProxy.xml.

Elemen akar dari file ini adalah elemen CurrentApp , yang mewakili aplikasi saat ini. Elemen ini berisi elemen turunan berikut.

Elemen Diperlukan Kuantitas Deskripsi
ListingInformation Ya 1 Berisi data dari daftar aplikasi.
LicenseInformation Ya 1 Menjelaskan lisensi yang tersedia untuk aplikasi ini dan add-on tahan lamanya.
ConsumableInformation Tidak 0 atau 1 Menjelaskan add-on yang dapat dikonsumsi yang tersedia untuk aplikasi ini.
Simulasi Tidak 0 atau 1 Menjelaskan bagaimana panggilan ke berbagai metode CurrentAppSimulator akan berfungsi di aplikasi selama pengujian.

Elemen ListingInformation

Elemen ini berisi data dari daftar aplikasi. ListingInformation adalah turunan yang diperlukan dari elemen CurrentApp .

ListingInformation berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
App Ya 1 Menyediakan data tentang aplikasi.
Produk Tidak 0 atau lebih Menjelaskan add-on untuk aplikasi.

Elemen aplikasi (turunan dari ListingInformation)

Elemen ini menjelaskan lisensi aplikasi. Aplikasi adalah anak yang diperlukan dari elemen ListingInformation .

Aplikasi berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
AppId Ya 1 GUID yang mengidentifikasi aplikasi di Store. Ini bisa menjadi GUID apa pun untuk pengujian.
LinkUri Ya 1 URI halaman daftar di penyimpanan. Ini bisa menjadi URI yang valid untuk pengujian.
CurrentMarket Ya 1 Negara/wilayah pelanggan.
AgeRating Ya 1 Bilangan bulat yang mewakili peringkat usia minimum aplikasi. Ini adalah nilai yang sama dengan yang akan Anda tentukan di Pusat Mitra saat Mengirimkan aplikasi. Nilai yang digunakan oleh Store adalah: 3, 7, 12, dan 16. Untuk informasi selengkapnya tentang peringkat ini, lihat Peringkat usia.
MarketData Ya 1 atau lebih Berisi info tentang aplikasi untuk negara/wilayah tertentu. Untuk setiap negara/wilayah tempat aplikasi dicantumkan, Anda harus menyertakan elemen MarketData .

Elemen MarketData (turunan dari Aplikasi)

Elemen ini menyediakan info tentang aplikasi untuk negara/wilayah tertentu. Untuk setiap negara/wilayah tempat aplikasi dicantumkan, Anda harus menyertakan elemen MarketData . MarketData adalah anak yang diperlukan dari elemen Aplikasi .

MarketData berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
Nama Ya 1 Nama aplikasi di negara/wilayah ini.
Deskripsi Ya 1 Deskripsi aplikasi untuk negara/wilayah ini.
Harga Ya 1 Harga aplikasi di negara/wilayah ini.
CurrencySymbol Ya 1 Simbol mata uang yang digunakan di negara/wilayah ini.
CurrencyCode Tidak 0 atau 1 Kode mata uang yang digunakan di negara/wilayah ini.

MarketData memiliki atribut berikut.

Atribut Diperlukan Deskripsi
xml:lang Ya Menentukan negara/wilayah tempat info data pasar diterapkan.

Elemen produk (turunan dari ListingInformation)

Elemen ini menjelaskan add-on untuk aplikasi. Produk adalah turunan opsional dari elemen ListingInformation , dan berisi satu atau beberapa elemen MarketData .

Produk memiliki atribut berikut.

Atribut Diperlukan Deskripsi
ProductId Ya Berisi string yang digunakan oleh aplikasi untuk mengidentifikasi add-on.
LicenseDuration Tidak Menunjukkan jumlah hari di mana lisensi akan valid setelah item dibeli. Tanggal kedaluwarsa lisensi baru yang dibuat oleh pembelian produk adalah tanggal pembelian ditambah durasi lisensi. Atribut ini hanya digunakan jika atribut ProductTypetahan lama; atribut ini diabaikan untuk add-on yang dapat dikonsumsi.
ProductType Tidak Berisi nilai untuk mengidentifikasi persistensi produk dalam aplikasi. Nilai yang didukung adalah Durable (default) dan Consumable. Untuk jenis tahan lama, informasi tambahan dijelaskan oleh elemen Produk di bawah LicenseInformation; untuk jenis yang dapat dikonsumsi, informasi tambahan dijelaskan oleh elemen Produk di bawah ConsumableInformation.

Elemen MarketData (turunan dari Produk)

Elemen ini menyediakan info tentang add-on untuk negara/wilayah tertentu. Untuk setiap negara/wilayah tempat add-on dicantumkan, Anda harus menyertakan elemen MarketData . MarketData adalah anak yang diperlukan dari elemen Produk .

MarketData berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
Nama Ya 1 Nama add-on di negara/wilayah ini.
Harga Ya 1 Harga add-on di negara/wilayah ini.
CurrencySymbol Ya 1 Simbol mata uang yang digunakan di negara/wilayah ini.
CurrencyCode Tidak 0 atau 1 Kode mata uang yang digunakan di negara/wilayah ini.
Deskripsi Tidak 0 atau 1 Deskripsi add-on untuk negara/wilayah ini.
Menandai Tidak 0 atau 1 Data pengembang kustom (juga disebut tag) untuk add-on.
Kata kunci Tidak 0 atau 1 Berisi hingga 10 elemen Kata Kunci yang berisi kata kunci untuk add-on.
ImageUri Tidak 0 atau 1 URI untuk gambar dalam daftar add-on.

MarketData memiliki atribut berikut.

Atribut Diperlukan Deskripsi
xml:lang Ya Menentukan negara/wilayah tempat info data pasar diterapkan.

Elemen LicenseInformation

Elemen ini menjelaskan lisensi yang tersedia untuk aplikasi ini dan produk dalam aplikasinya yang tahan lama. LicenseInformation adalah turunan yang diperlukan dari elemen CurrentApp .

LicenseInformation berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
App Ya 1 Menjelaskan lisensi aplikasi.
Produk Tidak 0 atau lebih Menjelaskan status lisensi add-on yang tahan lama di aplikasi.

Tabel berikut ini memperlihatkan cara mensimulasikan beberapa kondisi umum dengan menggabungkan nilai di bawah elemen Aplikasi dan Produk .

Kondisi untuk mensimulasikan IsActive IsTrial ExpirationDate
Berlisensi penuh TRUE salah Absen. Ini sebenarnya mungkin ada dan menentukan tanggal mendatang, tetapi Anda disarankan untuk menghilangkan elemen dari file XML. Jika ada dan menentukan tanggal di masa lalu, IsActive akan diabaikan dan dianggap salah.
Dalam periode percobaan TRUE TRUE <tanggalwaktu di masa mendatang> Elemen ini harus ada karena IsTrial benar. Anda dapat mengunjungi situs web yang menunjukkan Waktu Universal Terkoordinasi (UTC) saat ini untuk mengetahui seberapa jauh di masa depan untuk mengatur ini untuk mendapatkan periode percobaan yang tersisa yang Anda inginkan.
Uji coba kedaluwarsa salah TRUE <tanggalwaktu di masa lalu> Elemen ini harus ada karena IsTrial benar. Anda dapat mengunjungi situs web yang menunjukkan Waktu Universal Terkoordinasi (UTC) saat ini untuk mengetahui kapan "masa lalu" berada di UTC.
tidak valid false false <nilai apa pun atau dihilangkan>

Elemen aplikasi (turunan dari LicenseInformation)

Elemen ini menjelaskan lisensi aplikasi. Aplikasi adalah turunan yang diperlukan dari elemen LicenseInformation .

Aplikasi berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
IsActive Ya 1 Menjelaskan status lisensi aplikasi ini saat ini. Nilai benar menunjukkan lisensi valid; false menunjukkan lisensi yang tidak valid. Biasanya nilai ini benar, apakah aplikasi memiliki mode uji coba atau tidak. Atur nilai ini ke false untuk menguji bagaimana aplikasi Anda berperilaku saat memiliki lisensi yang tidak valid.
IsTrial Ya 1 Menjelaskan status uji coba aplikasi ini saat ini. Nilai true menunjukkan bahwa aplikasi sedang digunakan selama periode uji coba; false menunjukkan aplikasi tidak dalam uji coba, baik karena aplikasi telah dibeli atau periode uji coba telah kedaluwarsa.
ExpirationDate Tidak 0 atau 1 Tanggal periode uji coba untuk aplikasi ini kedaluwarsa, dalam Waktu Universal Terkoordinasi (UTC). Tanggal harus dinyatakan sebagai: yyyy-mm-ddThh:mm:ss.ssZ. Misalnya, 05:00 pada 19 Januari 2015 akan ditentukan sebagai 2015-01-19T05:00:00.00Z. Elemen ini diperlukan ketika IsTrialbenar. Jika tidak, itu tidak diperlukan.

Elemen produk (turunan dari LicenseInformation)

Elemen ini menjelaskan status lisensi add-on yang tahan lama di aplikasi. Produk adalah turunan opsional dari elemen LicenseInformation .

Produk berisi elemen anak berikut.

Elemen Diperlukan Kuantitas Deskripsi
IsActive Ya 1 Menjelaskan status lisensi add-on ini saat ini. Nilai true menunjukkan add-on dapat digunakan; false menunjukkan add-on tidak dapat digunakan atau belum dibeli
ExpirationDate Tidak 0 atau 1 Tanggal add-on kedaluwarsa, dalam Waktu Universal Terkoordinasi (UTC). Tanggal harus dinyatakan sebagai: yyyy-mm-ddThh:mm:ss.ssZ. Misalnya, 05:00 pada 19 Januari 2015 akan ditentukan sebagai 2015-01-19T05:00:00.00Z. Jika elemen ini ada, add-on memiliki tanggal kedaluwarsa. Jika tidak ada, add-on tidak akan kedaluwarsa.

Produk memiliki atribut berikut.

Atribut Diperlukan Deskripsi
ProductId Ya Berisi string yang digunakan oleh aplikasi untuk mengidentifikasi add-on.
OfferId Tidak Berisi string yang digunakan oleh aplikasi untuk mengidentifikasi kategori tempat add-on berada. Ini menyediakan dukungan untuk katalog item besar, seperti yang dijelaskan dalam Mengelola katalog besar produk dalam aplikasi.

Elemen simulasi

Elemen ini menjelaskan bagaimana panggilan ke berbagai metode CurrentAppSimulator akan berfungsi di aplikasi selama pengujian. Simulasi adalah turunan opsional dari elemen CurrentApp , dan berisi nol atau lebih elemen DefaultResponse .

Simulasi memiliki atribut berikut.

Atribut Diperlukan Deskripsi
SimulasiMode Tidak Nilai bisa Interaktif atau Otomatis. Ketika atribut ini diatur ke Otomatis, metode akan secara otomatis mengembalikan kode kesalahan HRESULT yang ditentukan. Ini dapat digunakan saat menjalankan kasus pengujian otomatis.

Elemen DefaultResponse

Elemen ini menjelaskan kode kesalahan default yang dikembalikan oleh metode CurrentAppSimulator . DefaultResponse adalah turunan opsional dari elemen Simulasi .

DefaultResponse memiliki atribut berikut.

Atribut Diperlukan Deskripsi
MethodName Ya Tetapkan atribut ini ke salah satu nilai enum yang ditampilkan untuk jenis StoreMethodName dalam skema. Masing-masing nilai enum ini mewakili metode CurrentAppSimulator yang ingin Anda simulasikan nilai pengembalian kode kesalahan di aplikasi Anda selama pengujian. Misalnya, nilai RequestAppPurchaseAsync_GetResult menunjukkan Anda ingin mensimulasikan nilai pengembalian kode kesalahan dari metode RequestAppPurchaseAsync .
Hresult Ya Tetapkan atribut ini ke salah satu nilai enum yang ditampilkan untuk jenis ResponseCodes dalam skema. Masing-masing nilai enum ini mewakili kode kesalahan yang ingin Anda kembalikan untuk metode yang ditetapkan ke atribut MethodName untuk elemen DefaultResponse ini.

Elemen ConsumableInformation

Elemen ini menjelaskan add-on yang dapat dikonsumsi yang tersedia untuk aplikasi ini. ConsumableInformation adalah turunan opsional dari elemen CurrentApp , dan dapat berisi nol atau beberapa elemen Produk .

Elemen produk (turunan dari ConsumableInformation)

Elemen ini menjelaskan add-on yang dapat dikonsumsi. Produk adalah turunan opsional dari elemen ConsumableInformation .

Produk memiliki atribut berikut.

Atribut Diperlukan Deskripsi
ProductId Ya Berisi string yang digunakan oleh aplikasi untuk mengidentifikasi add-on yang dapat dikonsumsi.
TransactionId Ya Berisi GUID (sebagai string) yang digunakan oleh aplikasi untuk melacak transaksi pembelian yang dapat dikonsumsi melalui proses pemenuhan. Lihat Mengaktifkan pembelian produk dalam aplikasi yang dapat dikonsumsi.
Kondisi Ya Berisi string yang digunakan oleh aplikasi untuk menunjukkan status pemenuhan yang dapat dikonsumsi. Nilai dapat berupa Active, PurchaseReverted, PurchasePending, atau ServerError.
OfferId Tidak Berisi string yang digunakan oleh aplikasi untuk mengidentifikasi kategori tempat yang dapat dikonsumsi berada. Ini menyediakan dukungan untuk katalog item besar, seperti yang dijelaskan dalam Mengelola katalog besar produk dalam aplikasi.