第11回 アプリに広告を出す(前編:基礎知識編):連載:Windowsストア・アプリ開発入門(3/5 ページ)
Windowsストアアプリの機能が完成したら、実際にストアで公開する前に、アプリをお金に換えるための機能を実装しよう。今回はマネタイズの仕組みを解説する。
アプリ内販売
これは、アプリをインストールするのは無料だが、特定の機能を使う(または停止させる。例えば、広告表示機能を停止させるなど)には料金を支払うという方式だ(有料アプリと組み合わせてもよい)。料金の支払い手続きなどの仕組みはWindowsストアが提供してくれるが、特定の機能を使う(または停止させる)仕組みはアプリ側で作り込む必要がある。
アプリ内販売には、次の2通りの方式が用意されている。
- 持続型: 一度購入すれば、指定した期限が切れるまで有効なもの。有効期限はWindowsストアが管理してくれる。上記のWindowsStoreProxy.xmlファイルでは<ListingInformation>‐<Product>タグで「ProductType="Durable"」として識別される。Win 8のときからあった方式
- 使い切り型(消尽型): マイクロソフトでは「コンシューマブルなアプリ内購入」と呼んでいる。購入時点で使い切ってしまうもの。有効期限などのライセンス管理はアプリ側で行わなければならない。同じく<ListingInformation>‐<Product>タグで「ProductType="Consumable"」として識別される。Win 8.1で新しく用意された方式
使い切り型は、エンドユーザーが購入したときに発行されるトランザクションIDを使って、アプリ側で有効期限などを管理しなければならず、実装が複雑になる。また、アプリ側でお金を扱っているようなものだから、その実装には高い信頼性も要求されることになる。その代わり、柔軟な販売形態が可能になる。例えば、ゲームのアイテムで同じものを複数購入できるようにしたり、週刊誌のようにコンテンツを発行するごとに購入してもらうようにしたりといったことが可能だ。
どちらの方式にしても、アプリ側の実装と、Windowsストアのダッシュボードでの設定が必要だ。それぞれ説明していく。
持続型のアプリ内販売
持続型のアプリ内販売は、ライセンスの管理(購入したかどうか、有効期限内かどうか、など)をWindowsストアが行ってくれるため、信頼性の高いアプリ内販売が簡単に実装できる。
事前に次のことを決めておく。
- 価格帯と有効期間
- ProductId: 「製品ID」、「アプリ内販売トークン」などとも呼ばれる。販売するものを識別するための英数字文字列
- Name: 「アプリ内販売の説明」とも呼ばれる。100文字までの文字列。購入UIに表示されるので、購入することで何が起きるのかをエンドユーザーに分かりやすく説明しなければならない
この中で実装に必要なものは、「有効期間」と「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>
自動生成された「WindowsStoreProxy.xml」ファイルで、太字の部分を変更した(有効期間とIsActive)。
<ListingInformation>要素内の<Product>タグに「ProductType」属性が「Durable」と指定されており、持続型のアプリ内販売だと分かる。
なお、有効期間を無期限にするには「LicenseDuration="0"」とする。
アプリの実装は、購入済みでないことを確認して購入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
}
ここでは「App.xaml.cs」ファイルのOnLaunchedメソッドの末尾に記述して、アプリの起動直後に購入のUIが表示されるようにした。実際にはここではよくないだろう。購入するためのボタンなどを提示して、エンドユーザーの操作によって購入操作をしてもらうべきだ。
このコードで表示されるUIは、前述した試用期間中にアプリを購入する場合とほぼ同じである(アプリ名が、100文字までのNameに変わる)。
最後に、アプリをWindowsストアに提出する際に、必要な情報を記入する(次の画像)。
Windowsストアのダッシュボードで持続型のアプリ内販売を設定する画面(Internet Explorer)
[サービス]のページで、事前に決めてWindowsStoreProxy.xmlファイルで設定したのと同じように、アプリ内販売の[製品ID](=ProductId)を入力し、[価格帯]/[製品の有効期間]を選択する(上の画像)。その右の[コンテンツタイプ]は、そのままでよいようだ*6。ここでアプリ内販売の[製品ID]を入力して[保存]ボタンをクリックすると、[説明]ページにアプリ内販売の説明を入力する欄が表示されるようになる。 次に、[説明]のページで[アプリ内販売の説明](=Name)を入力する(下の画像)。複数のアプリ内販売を行う場合は、入力欄の左に[製品ID](=ProductId)が表示されているので、間違えないように入力する。 なお、下の画像は、他のアプリのものである。[説明]のページは、アプリのパッケージをアップロードするまで開けない。本アプリは次回でアップロードする予定だ。
*6 この[コンテンツタイプ]について、MSDNには記載がないようだ。デフォルトは[アプリから継承](アプリと同類のコンテンツという意味のようだ)となっているので、通常はそのままにしておけばよいだろう。選択肢には、他に[音楽ダウンロード]/[電子マガジンの1回の発行]など10種類ほどがある。おそらくは統計用の項目だと思われる。
持続型のアプリ内販売の実装については、MSDNの「アプリ内購入の有効化」も参照してもらいたい。
Copyright© Digital Advantage Corp. All Rights Reserved.