In-App Purchaseの概要については、連載1回目を参照してください。
iTunes Connectでプロダクトを定義したら、いよいよ実装です。
アプリケーション内のストアにプロダクトを表示するには、プロダクト定義時に指定した識別子(以後プロダクトID)をApp Storeに送信し、プロダクト情報を取得する必要があります。
プロダクトの名前や価格はアプリケーションの外で変更可能なため、今現在の値を取得する必要があるのと、後の支払い処理に取得したプロダクト情報が必要なためです。
プロダクト情報の取得は、プロダクトIDの一覧を引数に指定して SKProductsRequest のインスタンスを生成し、リクエストを送信することで開始されます。
SKProductsRequest *request = [[KSProductsRequest alloc]
initWithProductIdentifiers:productIds];
request.delegate = self;
[request start];
送信するプロダクトIDの一覧は、アプリケーションに何らかの形で埋め込みます。
リクエスト時にIDを送信しなかったプロダクトは、iTunes Connectに登録があっても情報取得されません。
「Speedy - ケータイ風短縮ダイヤル」では扱うプロダクトがひとつなので、プロダクトIDを管理クラスにハードコードしています。
「Countil - あと何日で・・・」は多くのプロダクトを扱うため、付加情報とともにJSONファイルにまとめています。
■プロダクト情報の取得
リクエスト結果は、SKProductRequestDelegateの productRequest:didReceiveResponse: メソッドで受け取ります。
ここではプロダクト名や価格などを表示用に準備するとともに、無効なプロダクトを表示対象からはずす必要があります。
無効なプロダクトとは、送信したプロダクトIDのうちiTunes Connect側の設定などで現在販売対象となっていないプロダクトです。
これらは販売できないので、ストアUIへの表示を省略することが推奨されています。
/*
結果を受け取るデリゲートメソッド。
*/
- (void)productRequest:(SKProductsRequest *)request
didReceiveResponse:(SKProductsResponse *)response {
// 無効なプロダクトIDを保持。
_invalidProducIds = response.invalidProductIdentifiers;
// ...
}
/*
プロダクト一覧を返す。
*/
- (NSArray *)products {
// 返り値用の配列を初期化。
NSMutableArray *products = [NSMutableArray array];
// プロダクトの内部表現(Product*)の配列を走査。
for (Product *product in _products) {
// 無効なプロダクトIDとして記録されている場合はスキップ。
if ([_invalidProductIds containsObject:product.productId])
continue;
// そうでなければ返り値に追加。
[products addObject:product];
}
return products;
}
プロダクト情報が取得できたら、ストアUIを表示します。
ストアUIにはプロダクトの名前や説明、価格、および購入の意思を示すためのボタンなどが含まれ、アプリケーションの他の画面と統合された表示が推奨されています。
Countilでは、プロダクトの販売を行う「ストア画面」を用意するとともに、壁紙選択画面でのシームレスな購入経路を用意しています。
■プロダクト情報取得の頻度について
プロダクト情報取得リクエストの送信は、基本的にはストアUIの表示の度に毎回行うべきだと筆者は考えています。利用者の端末でアプリケーションが実行されている最中に、iTunes Connectで価格等の変更が行われ得るためです。
Countilの「ストア画面」では正確な価格等を表示するため、プロダクト情報の取得が完了するまで利用者の操作をブロックしています。一方、壁紙選択画面では、利用者の操作を妨げないよう先に画面を表示し、プロダクト情報が取得できた時点で画面を更新する工夫をしています。
今回は、プロダクト情報の取得とストアUIの表示について紹介しました。
次回は、利用者の操作をトリガーとする、支払い処理について紹介する予定です。
0 件のコメント:
コメントを投稿