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:
- Buka file WindowsStoreProxy.xml di Visual Studio.
- Pada menu XML , klik Buat Skema. Ini akan membuat file WindowsStoreProxy.xsd sementara berdasarkan konten file XML.
- Ganti konten file .xsd tersebut dengan skema di bawah ini.
- Simpan file ke lokasi tempat Anda dapat menerapkannya ke beberapa proyek aplikasi.
- Beralih ke file WindowsStoreProxy.xml Anda di Visual Studio.
- 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. |
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk