酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xamarin.iOSでStoreKitを使って広告非表示やアイテム課金などの商品(プロダクト)の一覧を取得する

Xamarin.iOSでStoreKitを使って広告非表示やアイテム課金などの商品の一覧を取得してみましょう。

StoreKit上では前述の商品のことを「プロダクト」と呼びます。StoreKitでの基本的な処理の流れとしては、SKProductXXXXクラスでプロダクトの情報を取得して、SKPaymentXXXクラスでプロダクトの購入をおこないます。

ここでは仮にjp.ch3cooh.exampleというIDのプロダクトの情報を取得したいと思います。

// プロダクトの一覧を羅列する
var products = new NSSet(new []{
    "jp.ch3cooh.example",
});
ProductRequest = new StoreKit.SKProductsRequest(products);
ProductRequest.RequestFailed +=  (sender, e) => {
    Console.WriteLine("プロダクトの取得に失敗しました");
};
ProductRequest.ReceivedResponse += (sender, e) => {
    Console.WriteLine("プロダクトの取得に成功しました");

    // レスポンスのあったプロダクトの一覧の中から
    // 任意のIDのプロダクト情報を取得する
    var product = e.Response.Products
        .SingleOrDefault(res => res.ProductIdentifier == "jp.ch3cooh.example");
 
    // プロダクトIDを取得する
    var pid = product.ProductIdentifier;

    // ローカライズされたプロダクトの名称を取得する
    var title = product.LocalizedTitle;

    // ローカライズされたプロダクトの値段を取得する
    // (拡張メソッドです:詳しくは後述にて)
    var price = product.GetLocalizedPrice();

    // プロダクトの説明
    var description = product.LocalizedDescription;
};

// プロダクトの詳細情報(日本語や英語での名前や料金など)を要求する
ProductRequest.Start();

上記のサンプルコードででてきた拡張メソッドのGetLocalizedPriceメソッドについて説明します。

StoreKitでのプログラミングガイドでも推奨されていますが、プロダクトの価格を静的なリソースとして持つべきではありません。つい先日も日本のAppStoreでのアプリ値段の値上げが発表されましたね。このように、Appleの任意のタイミングで価格の変更ができるようになっているからです。

プロダクトの販売時点の値段を正しく表示するためには、ユーザーからすると多少待ち時間が発生してしまうのですが毎回プロダクト情報を取得して値段を組み立てる必要があります。「組み立てる」という言葉を使ったのはプロダクトの価格が「1,000円」 という形でくるのではなく、値段(Priceプロパティ)とその値段が示すロケール(PriceLocaleプロパティ)を元にNSNumberFormatterクラスを使うからです。……といった定型的な処理をする必要があるので拡張メソッドにしています。

public static class SKProductExtension
{
    public static string GetLocalizedPrice(this SKProduct product)
    {
        var priceString = default(string);
        using (var formatter = new NSNumberFormatter())
        {
            formatter.FormatterBehavior = NSNumberFormatterBehavior.Version_10_4;  
            formatter.NumberStyle = NSNumberFormatterStyle.Currency;
            formatter.Locale = product.PriceLocale;
            priceString = formatter.StringFromNumber(product.Price);
        }
        return priceString;
    }
}

Xamarin.iOSではなくObjective-Cでの実装例ですが、StoreKit自体の実装のヒントには是非「 アプリ内課金+広告iPhoneプログラミング」をどうぞ。

アプリ内課金+広告iPhoneプログラミング

アプリ内課金+広告iPhoneプログラミング