前回の記事「In-app purchaseで既に購入したアイテムをリストアする」続きです。
In-app purchaseで非消費型のアイテムを復元するのは特に問題はありませんが、
消費型のアイテムを復元するのは少し問題があります。
例えば、RPGゲームなどの場合、回復アイテムなど、使ったらなくなるものが消費型アイテムです。
武器や鎧といった装備アイテムや、機能制限解除などの課金コンテンツが非消費型のアイテムです。
もう一つ、定期購読型もありますが、ここでは詳しくは言及しません。
非消費型アイテムに関しては、Apple IDと紐付いていて、別の端末で購入済みのものを新しい端末で再度購入するときに、重複して課金されないようにできます。
ですが、消費型アイテムに関しては、購入された回数は使用した回数をAppleの方で管理する機能は提供されていません。
通常の方法ですと、独自サーバーを準備して、ユーザー毎のチケット枚数を管理しておき、別の端末からログインがあった時にサーバーの情報と照らしあわせて復元しないといけません。
ですが、サーバーを導入する場合、開発費はもちろん、サーバー管理費や維持費で、開発コストが上がってしまうため、サーバーを使うのを避けたいというケースがあります。
サーバーを使わないイレギュラーな方法として、keychainに格納する方法があります。
これは、Apple IDとパスワードが一致していれば同じKey chainを使用するという仕組みを利用した方法です。
すでに、AppleのサイトでWrapper関数が提供されていますので、
これを使えばNSUserDefaultsと同じような感覚で使用することができます。
GenericKeychainのソースコードダウンロードリンク
なお、これを使用するためには、
Security.frameworkをプロジェクトに追加する必要があります。
保存する方法は、下記のようになります。
// Storing the consumable item count int numItems = 100; KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Items" accessGroup:nil]; NSString *itemsString = [NSString stringWithFormat:@"%i",numItems]; [wrapper setObject:itemsString forKey:(id)kSecValueData]; [wrapper release]; <pre>
復元する方法は、下記のようになります。
// Retrieving the consumable item count KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Items" accessGroup:nil]; NSString *numItems = [wrapper objectForKey:(id)kSecValueData]; [wrapper release]; int retrievedHints = [numItems intValue]; <pre>