これは、アプリをインストールするのは無料だが、特定の機能を使う(または停止させる。例えば、広告表示機能を停止させるなど)には料金を支払うという方式だ(有料アプリと組み合わせてもよい)。料金の支払い手続きなどの仕組みはWindowsストアが提供してくれるが、特定の機能を使う(または停止させる)仕組みはアプリ側で作り込む必要がある。
アプリ内販売には、次の2通りの方式が用意されている。
使い切り型は、エンドユーザーが購入したときに発行されるトランザクションIDを使って、アプリ側で有効期限などを管理しなければならず、実装が複雑になる。また、アプリ側でお金を扱っているようなものだから、その実装には高い信頼性も要求されることになる。その代わり、柔軟な販売形態が可能になる。例えば、ゲームのアイテムで同じものを複数購入できるようにしたり、週刊誌のようにコンテンツを発行するごとに購入してもらうようにしたりといったことが可能だ。
どちらの方式にしても、アプリ側の実装と、Windowsストアのダッシュボードでの設定が必要だ。それぞれ説明していく。
持続型のアプリ内販売は、ライセンスの管理(購入したかどうか、有効期限内かどうか、など)をWindowsストアが行ってくれるため、信頼性の高いアプリ内販売が簡単に実装できる。
事前に次のことを決めておく。
この中で実装に必要なものは、「有効期間」と「ProductId」だけだ。例えば、有効期間が365日で、ProductIdが「1」の場合、テスト用の「WindowsStoreProxy.xml」ファイルは次のようになる。
<?xml version="1.0" encoding="utf-16" ?>
<CurrentApp>
<ListingInformation>
<App>
……省略……
</App>
<Product ProductId="1" LicenseDuration="365" ProductType="Durable">
<MarketData xml:lang="en-us">
<Name>Product1Name</Name>
<Price>1.00</Price>
<CurrencySymbol>$</CurrencySymbol>
<CurrencyCode>USD</CurrencyCode>
</MarketData>
</Product>
……省略……
</ListingInformation>
<LicenseInformation>
<App>
……省略……
</App>
<Product ProductId="1">
<IsActive>false</IsActive>
</Product>
</LicenseInformation>
……省略……
</CurrentApp>
アプリの実装は、購入済みでないことを確認して購入UIを出すようにする(次のコード)。
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
// ……省略……
var licenseInfo = LicenseInformation; // このプロパティのコードは既出
// ……省略……
Windows.ApplicationModel.Store.ProductLicense 機能1のライセンス
= licenseInfo.ProductLicenses["1"];
bool 機能1は購入済み = 機能1のライセンス.IsActive;
if (!機能1は購入済み)
{
// 機能1が未購入だったら、起動時に購入のUIを出す
var purchaseResults = await RequestProductPurchaseAsync("1");
// エンドユーザーが購入してくれたら、この時点で
// 機能1のライセンス.IsActive == true
// 機能1のライセンス.ExpirationDate == 2015/XX/XX (1年後の日時)
// に変わっている
}
機能1は購入済み = 機能1のライセンス.IsActive;
if (機能1は購入済み)
{
// 購入済みの場合に機能を有効にするための処理(フラグを立てるなど)
}
}
private async System.Threading.Tasks.Task<Windows.ApplicationModel.Store.PurchaseResults>
RequestProductPurchaseAsync(string productId)
{
#if DEBUG
try
{
return await Windows.ApplicationModel.Store.CurrentAppSimulator.RequestProductPurchaseAsync(productId);
}
catch
{
// 購入シミュレートUIでエラーを発生させた
return null;
}
#else
try
{
return await Windows.ApplicationModel.Store.CurrentApp.RequestProductPurchaseAsync(productId);
}
catch
{
// 通信エラーや、Windowsストア側のエラーなどが発生した
return null;
}
#endif
}
このコードで表示されるUIは、前述した試用期間中にアプリを購入する場合とほぼ同じである(アプリ名が、100文字までのNameに変わる)。
最後に、アプリをWindowsストアに提出する際に、必要な情報を記入する(次の画像)。
*6 この[コンテンツタイプ]について、MSDNには記載がないようだ。デフォルトは[アプリから継承](アプリと同類のコンテンツという意味のようだ)となっているので、通常はそのままにしておけばよいだろう。選択肢には、他に[音楽ダウンロード]/[電子マガジンの1回の発行]など10種類ほどがある。おそらくは統計用の項目だと思われる。
持続型のアプリ内販売の実装については、MSDNの「アプリ内購入の有効化」も参照してもらいたい。
Copyright© Digital Advantage Corp. All Rights Reserved.