次の方法で共有


Windows.ApplicationModel.Store 名前空間を使用するアプリ内購入と試用版

Windows.ApplicationModel.Store名前空間のメンバーを使用して、アプリ内購入と試用版機能を ユニバーサル Windows プラットフォーム (UWP) アプリに追加して、アプリの収益化に役立ちます。 これらの API は、アプリのライセンス情報へのアクセスも提供します。

このセクションの記事では、いくつかの一般的なシナリオで Windows.ApplicationModel.Store 名前空間のメンバーを使用するための詳細なガイダンスとコード例を示します。 UWP アプリでのアプリ内購入に関連する基本的な概念の概要については、「 アプリ内購入と試用版を参照してください。 Windows.ApplicationModel.Store名前空間を使用して試用版とアプリ内購入を実装する方法を示す完全なサンプルについては、Store サンプルを参照してください。

重要

Windows.ApplicationModel.Store名前空間は、新機能で更新されなくなりました。 プロジェクトのターゲットが Windows 10 Anniversary Edition (10.0;Visual Studio のビルド 14393) 以降のリリース (つまり、Windows 10 バージョン 1607 以降を対象としています) は、代わりに Windows.Services.Store 名前空間を使用することをお勧めします。 詳しくは、「アプリ内購入と試用版」をご覧ください。 Windows.ApplicationModel.Store 名前空間は、デスクトップ ブリッジを使う Windows デスクトップ アプリケーションや、パートナー センターの開発サンドボックスを使うアプリまたはゲーム (たとえば、Xbox Live と統合されるゲームがすべて該当します) ではサポートされません。 これらの製品では、 Windows.Services.Store 名前空間を使用して、アプリ内購入と試用版を実装する必要があります。

CurrentApp クラスと CurrentAppSimulator クラスの概要

Windows.ApplicationModel.Store名前空間のメイン エントリ ポイントは、CurrentApp クラスです。 このクラスには、現在のアプリとその使用可能なアドオンの情報の取得、現在のアプリまたはそのアドオンのライセンス情報の取得、現在のユーザーのアプリまたはアドオンの購入、その他のタスクの実行に使用できる静的プロパティとメソッドが用意されています。

CurrentApp クラスは Microsoft Store からデータを取得するため、アプリでこのクラスを正常に使用するには、開発者アカウントが必要であり、アプリをストアで公開する必要があります。 アプリをストアに送信する前に、 CurrentAppSimulator というシミュレートされたバージョンのこのクラスでコードをテストできます。 アプリをテストした後、Microsoft Store に提出する前に、 CurrentAppSimulator のインスタンスを CurrentApp に置き換える必要があります。 CurrentAppSimulator を使用している場合、アプリは認定に失敗します。

CurrentAppSimulator を使用すると、アプリのライセンスとアプリ内製品の初期状態が、WindowsStoreProxy.xmlという名前の開発用コンピューター上のローカル ファイルに記述されます。 このファイルの詳細については、「 CurrentAppSimulator を使用したWindowsStoreProxy.xml ファイルの使用を参照してください。

CurrentAppCurrentAppSimulator を使用して実行できる一般的なタスクの詳細については、次の記事を参照してください。

トピック 説明
試用版の機能を除外または制限する ユーザーがアプリを無料で使うことができる試用期間を設け、その期間中は一部の機能を除外または制限することで、アプリを通常版にアップグレードするようユーザーに促すことができます。
アプリ内製品購入の有効化 アプリが無料であるかどうかにかかわらず、コンテンツ、その他のアプリ、アプリの新機能 (ゲームの次のレベルのロック解除など) をアプリ内から直接販売できます。 ここでは、アプリ内で製品を販売できるようにする方法について説明します。
コンシューマブルなアプリ内製品購入の有効化 ストアの商取引プラットフォームを使ってコンシューマブルなアプリ内製品 (購入、使用、再購入が可能なアイテム) をサポートすると、堅牢かつ信頼性の高いアプリ内購入エクスペリエンスを顧客に提供できます。 これは、購入して、特定のパワーアップを購入するために使うことができるゲーム内通貨 (ゴールド、コインなど) 用に特に便利です。
アプリ内製品の大規模なカタログの管理 アプリ内製品のカタログが大きくなる場合、カタログを管理するためにこのトピックで説明するプロセスを採用できます。
受領通知を使った製品購入の確認 製品の購入が成功する各 Microsoft Store トランザクションは、必要に応じて、一覧に記載されている製品と金額に関する情報を顧客に提供するトランザクションレシートを返すことができます。 この情報にアクセスすると、ユーザーがアプリを購入したこと、または Microsoft Store からアプリ内製品を購入したことをアプリで確認する必要があるシナリオがサポートされます。

CurrentAppSimulator でWindowsStoreProxy.xml ファイルを使用する

CurrentAppSimulator を使用すると、アプリのライセンスとアプリ内製品の初期状態が、WindowsStoreProxy.xmlという名前の開発用コンピューター上のローカル ファイルに記述されます。 CurrentAppSimulator ライセンスの購入やアプリ内購入の処理などによってアプリの状態を変更するメソッドは、メモリ内の CurrentAppSimulator オブジェクトの状態のみを更新します。 WindowsStoreProxy.xmlの内容は変更されません。 アプリが再び起動すると、ライセンスの状態はWindowsStoreProxy.xmlで説明されているものに戻ります。

WindowsStoreProxy.xml ファイルは、既定で %UserProfile%\AppData\Local\Packages\<Local\Packages>\LocalState\Microsoft\Windows Store\ApiData に作成されます。 このファイルを編集して、 CurrentAppSimulator プロパティでシミュレートするシナリオを定義できます。

このファイルの値は変更できますが、代わりに使用する CurrentAppSimulator 用の独自のWindowsStoreProxy.xml ファイル (Visual Studio プロジェクトのデータ フォルダー内) を作成することをお勧めします。 トランザクションをシミュレートするときは、 ReloadSimulatorAsync を呼び出してファイルを読み込みます。 ReloadSimulatorAsyncを呼び出して独自のWindowsStoreProxy.xmlファイルを読み込まない場合、CurrentAppSimulatorは既定のWindowsStoreProxy.xml ファイルを作成または読み込みます (上書きしません)。

Note

CurrentAppSimulatorReloadSimulatorAsyncが完了するまで完全には初期化されないことに注意してください。 また、 ReloadSimulatorAsync は非同期メソッドであるため、別のスレッドで初期化されている間に CurrentAppSimulator をクエリする競合状態を回避するように注意する必要があります。 1 つの手法は、フラグを使用して初期化が完了したことを示す方法です。 Microsoft Store からインストールされたアプリでは、CurrentAppSimulator の代わりに CurrentApp を使用する必要があります。その場合、ReloadSimulatorAsync は呼び出されないため、前述の競合状態は適用されません。 このため、コードは同期と非同期の両方で動作するように設計する必要があります。

この例は、2015 年 1 月 19 日の 05:00 (UTC) に有効期限が切れる試用モードのアプリを記述するWindowsStoreProxy.xml ファイル (UTF-16 エンコード) です。

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

次の例は、購入済みのアプリを記述するWindowsStoreProxy.xml ファイル (UTF-16 エンコード) で、2015 年 1 月 19 日の 5:00 (UTC) に有効期限が切れ、アプリ内消費型の購入が可能な機能を備えます。

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

[スキーマ]

このセクションでは、WindowsStoreProxy.xml ファイルの構造を定義する XSD ファイルの一覧を示します。 WindowsStoreProxy.xml ファイルを操作するときに、Visual Studio の XML エディターにこのスキーマを適用するには、次の操作を行います。

  1. Visual Studio でWindowsStoreProxy.xml ファイルを開きます。
  2. XML メニューの [スキーマの作成] をクリック。 これにより、XML ファイルの内容に基づいて一時的な WindowsStoreProxy.xsd ファイルが作成されます。
  3. その .xsd ファイルの内容を次のスキーマに置き換えます。
  4. ファイルを複数のアプリ プロジェクトに適用できる場所に保存します。
  5. Visual Studio でWindowsStoreProxy.xml ファイルに切り替えます。
  6. XML メニューの Schemas をクリックし、WindowsStoreProxy.xsd ファイルの一覧で行を見つけます。 ファイルの場所が目的の場所ではない場合 (たとえば、一時ファイルがまだ表示されている場合)、 [追加]をクリックします。 適切なファイルに移動し、 OKをクリックします。 これで、そのファイルが一覧に表示されます。 そのスキーマの Use 列にチェックマークが表示されていることを確認します。

これを行うと、WindowsStoreProxy.xmlに加えた編集はスキーマの対象になります。 詳細については、「 方法: 使用する XML スキーマを選択する」を参照してください。

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

要素と属性の説明

このセクションでは、WindowsStoreProxy.xml ファイル内の要素と属性について説明します。

このファイルのルート要素は、現在のアプリを表す CurrentApp 要素です。 この要素には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
ListingInformation はい 1 アプリの一覧のデータが含まれています。
LicenseInformation はい 1 このアプリで使用できるライセンスとその永続的なアドオンについて説明します。
ConsumableInformation いいえ 0 または 1 このアプリで使用できるコンシューマブル なアドオンについて説明します。
シミュレーション いいえ 0 または 1 さまざまな CurrentAppSimulator メソッドの呼び出しがテスト中にアプリでどのように機能するかを説明します。

ListingInformation 要素

この要素には、アプリの一覧のデータが含まれています。 ListingInformation は、 CurrentApp 要素の必須の子です。

ListingInformation には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
アプリケーション はい 1 アプリに関するデータを提供します。
製品 いいえ 0 以上 アプリのアドオンについて説明します。

App 要素 (ListingInformation の子)

この要素は、アプリのライセンスについて説明します。 App は、 ListingInformation 要素の必須の子です。

App には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
AppId はい 1 ストア内のアプリを識別する GUID。 テスト用の任意の GUID を指定できます。
LinkUri はい 1 ストア内の登録情報ページの URI。 テストに使用できる任意の有効な URI を指定できます。
CurrentMarket はい 1 顧客の国/地域。
AgeRating はい 1 アプリの最小年齢レーティングを表す整数。 これは、アプリの提出時にパートナー センターで指定する値と同じです。 ストアで使用される値は、3、7、12、16 です。 これらの評価の詳細については、「 Age レーティング」を参照してください。
MarketData はい 1 回以上 特定の国/地域のアプリに関する情報が含まれています。 アプリが表示される国/地域ごとに、 MarketData 要素を含める必要があります。

MarketData 要素 (App の子)

この要素は、特定の国/地域のアプリに関する情報を提供します。 アプリが表示される国/地域ごとに、 MarketData 要素を含める必要があります。 MarketData は、 App 要素の必須の子です。

MarketData には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
件名 はい 1 この国/地域のアプリの名前。
説明 はい 1 この国/地域のアプリの説明。
価格 はい 1 この国/地域のアプリの価格。
CurrencySymbol はい 1 この国/地域で使用される通貨記号。
CurrencyCode いいえ 0 または 1 この国/地域で使用される通貨コード。

MarketData には次の属性があります。

Attribute 必須 説明
xml:lang はい 市場データ情報が適用される国/地域を指定します。

Product 要素 (ListingInformation の子)

この要素は、アプリのアドオンについて説明します。 Product は、 ListingInformation 要素の省略可能な子であり、1 つ以上の MarketData 要素が含まれています。

Product には次の属性があります。

Attribute 必須 説明
ProductId はい アプリがアドオンを識別するために使用する文字列を格納します。
LicenseDuration いいえ アイテムの購入後にライセンスが有効になる日数を示します。 製品購入によって作成された新しいライセンスの有効期限は、購入日とライセンス期間です。 この属性は、 ProductType 属性が Durable である場合にのみ使用されます。この属性は、コンシューマブル なアドオンでは無視されます。
ProductType いいえ アプリ内製品の永続化を識別する値が含まれています。 サポートされている値は Durable (既定値) と Consumableです。 非消耗品型の場合、追加の情報は Product 要素によって LicenseInformation; に記述されます。追加の情報は、ConsumableInformationProduct 要素によって記述されます。

MarketData 要素 (Product の子)

この要素は、特定の国/地域のアドオンに関する情報を提供します。 アドオンが表示される国/地域ごとに、 MarketData 要素を含める必要があります。 MarketData は、 Product 要素の必須の子です。

MarketData には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
件名 はい 1 この国/地域のアドオンの名前。
価格 はい 1 この国/地域のアドオンの価格。
CurrencySymbol はい 1 この国/地域で使用される通貨記号。
CurrencyCode いいえ 0 または 1 この国/地域で使用される通貨コード。
説明 いいえ 0 または 1 この国/地域のアドオンの説明。
Tag いいえ 0 または 1 アドオンの カスタム開発者データ (タグとも呼ばれます)。
キーワード いいえ 0 または 1 アドオンの keywords を含む最大 10 個の Keyword 要素が含まれます。
ImageUri いいえ 0 または 1 アドオンの一覧でイメージのURI。

MarketData には次の属性があります。

Attribute 必須 説明
xml:lang はい 市場データ情報が適用される国/地域を指定します。

LicenseInformation 要素

この要素は、このアプリで使用できるライセンスとその永続的なアプリ内製品について説明します。 LicenseInformation は、 CurrentApp 要素の必須の子です。

LicenseInformation には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
アプリケーション はい 1 アプリのライセンスについて説明します。
製品 いいえ 0 以上 アプリの永続的なアドオンのライセンス状態について説明します。

次の表は、 App 要素と Product 要素の値を組み合わせて、いくつかの一般的な条件をシミュレートする方法を示しています。

シミュレートする条件 IsActive IsTrial ExpirationDate
完全ライセンス true false 欠席する。 実際には存在する可能性があり、将来の日付を指定しますが、XML ファイルから要素を省略することをお勧めします。 存在し、過去の日付を指定した場合、 IsActive は無視され、false になります。
試用期間中 true true <将来の datetime> この要素は、 IsTrial が true であるため存在する必要があります。 現在の世界協定時刻 (UTC) を示す Web サイトにアクセスして、今後、これを設定して残りの試用期間を取得する方法を知ることができます。
期限切れの試用版 false true <過去の datetime> この要素は、 IsTrial が true であるため存在する必要があります。 現在の世界協定時刻 (UTC) を示す Web サイトにアクセスして、"過去" が UTC であることを確認できます。
無効 false false <任意の値または省略>

App 要素 (LicenseInformation の子)

この要素は、アプリのライセンスについて説明します。 App は、 LicenseInformation 要素の必須の子です。

App には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
IsActive はい 1 このアプリの現在のライセンス状態について説明します。 値 true はライセンスが有効であることを示します。 false は無効なライセンスを示します。 通常、この値は true、アプリに試用版モードがあるかどうか。 この値を false に設定して、無効なライセンスがある場合のアプリの動作をテストします。
IsTrial はい 1 このアプリの現在の試用版の状態について説明します。 値 true は、試用期間中にアプリが使用されていることを示します。 false は、アプリが購入されたか、試用期間が期限切れになったために、アプリが試用版に含まれていないかどうかを示します。
ExpirationDate いいえ 0 または 1 世界協定時刻 (UTC) で、このアプリの試用期間が期限切れになる日付。 日付は yyyy-mm-ddThh:mm:ss.ssZ で表す必要があります。 たとえば、2015 年 1 月 19 日の 05:00 は、2015-01-19T05:00:00.00Z と指定されます。 この要素は、 IsTrialtrue の場合に必要です。 それ以外の場合は必須ではありません。

Product 要素 (LicenseInformation の子)

この要素は、アプリの永続的なアドオンのライセンスの状態を表します。 Product は、 LicenseInformation 要素の省略可能な子です。

Product には、次の子要素が含まれています。

要素 必須 数量 (Quantity) 説明
IsActive はい 1 このアドオンの現在のライセンス状態について説明します。 値 true アドオンを使用できることを示します。 false は、アドオンを使用できないか、購入されていないことを示します
ExpirationDate いいえ 0 または 1 世界協定時刻 (UTC) でアドオンの有効期限が切れる日付。 日付は yyyy-mm-ddThh:mm:ss.ssZ で表す必要があります。 たとえば、2015 年 1 月 19 日の 05:00 は、2015-01-19T05:00:00.00Z と指定されます。 この要素が存在する場合、アドオンには有効期限があります。 存在しない場合、アドオンは期限切れになりません。

Product には次の属性があります。

Attribute 必須 説明
ProductId はい アプリがアドオンを識別するために使用する文字列を格納します。
OfferId いいえ アプリがアドオンが属するカテゴリを識別するために使用される文字列を格納します。 これは、「 アプリ内製品の大規模なカタログを管理する」で説明されているように、大規模なアイテム カタログのサポートを提供します

Simulation 要素

この要素は、さまざまな CurrentAppSimulator メソッドの呼び出しがテスト中にアプリでどのように機能するかを説明します。 Simulation は、 CurrentApp 要素の省略可能な子であり、0 個以上の DefaultResponse 要素が含まれています。

シミュレーション には次の属性があります。

Attribute 必須 説明
SimulationMode いいえ 値には、 Interactive または Automatic を指定できます。 この属性を Automatic に設定すると、メソッドは指定された HRESULT エラー コードを自動的に返します。 これは、自動テスト ケースを実行するときに使用できます。

DefaultResponse 要素

この要素は、 CurrentAppSimulator メソッドによって返される既定のエラー コードについて説明します。 DefaultResponse は、 Simulation 要素の省略可能な子です。

DefaultResponse には次の属性があります。

Attribute 必須 説明
MethodName はい この属性を、schemaStoreMethodName 型に表示される列挙値のいずれかに割り当てます。 これらの列挙値はそれぞれ、テスト中にアプリでエラー コードの戻り値をシミュレートする CurrentAppSimulator メソッドを表します。 たとえば、 RequestAppPurchaseAsync_GetResult 値は、 RequestAppPurchaseAsync メソッドのエラー コードの戻り値をシミュレートすることを示します。
HResult はい この属性を、schemaResponseCodes 型に表示される列挙値のいずれかに割り当てます。 これらの列挙値はそれぞれ、この DefaultResponse 要素の MethodName 属性に割り当てられているメソッドに対して返すエラー コードを表します。

ConsumableInformation 要素

この要素は、このアプリで使用できる消耗品アドオンについて説明します。 ConsumableInformation は、 CurrentApp 要素の省略可能な子であり、0 個以上の Product 要素を含めることができます。

Product 要素 (ConsumableInformation の子)

この要素は、消耗品のアドオンについて説明します。 Product は、 ConsumableInformation 要素の省略可能な子です。

Product には次の属性があります。

Attribute 必須 説明
ProductId はい アプリが消費型アドオンを識別するために使用する文字列を格納します。
TransactionId はい フルフィルメントのプロセスを通じて消耗品アイテムの購入トランザクションを追跡するためにアプリによって使用される GUID (文字列として) が含まれます。 使用可能なアプリ内製品の購入を参照してください。
Status はい アプリが消費型アイテムのフルフィルメント状態を示すために使用する文字列を格納します。 値には、 ActivePurchaseRevertedPurchasePending、または ServerError を指定できます。
OfferId いいえ アプリが消費型アイテムが属するカテゴリを識別するために使用される文字列を格納します。 これは、「 アプリ内製品の大規模なカタログを管理する」で説明されているように、大規模なアイテム カタログのサポートを提供します