ブログBlog
アプリ内課金の二重購入の防止策
投稿日:2014年09月03日
布内です。
先週のブログで、購入処理中に処理を中断するとおかしくなる現象ですが、少し進展がありました。
トランザクションを終了させずに、サインアウトすると、アプリ再開時にトランザクションが再開して、ログインを求められます。
この時にサインインせずにキャンセルすると先週の状態になりました。
トランザクションが終了されてないから、アプリ起動時に再開し、処理を行うためにサインインを要求してくるそうなので、とりあえずトランザクションが複数走らないようにします。
if([SKPaymentQueue defaultQueue].transactions!=0){
NSArray *transactions = [SKPaymentQueue defaultQueue].transactions;
for (SKPaymentTransaction *t in transactions) {
[[SKPaymentQueue defaultQueue] finishTransaction:t];
}
}
を購入要求の前に書きこんでみました。これで、ユーザーが購入要求をした時にトランザクションが残っていたら終了させます。
また、本に書いてたのですが、トランザクション開始時に
@synchronized(self) {
NSInteger TransactionCount = [[NSUserDefaults standardUserDefaults] integerForKey:@”Transaction”];
[[NSUserDefaults standardUserDefaults] setInteger:TransactionCount+1 forKey:@”Transaction”];
[[NSUserDefaults standardUserDefaults] synchronize];
}
トランザクション終了時に
@synchronized(self) {
NSInteger TransactionCount = [[NSUserDefaults standardUserDefaults] integerForKey:@”Transaction”];
[[NSUserDefaults standardUserDefaults] setInteger:TransactionCount-1 forKey:@”Transaction”];
[[NSUserDefaults standardUserDefaults] synchronize];
}
でトランザクションの数を記録しといて、トランザクションが残っていると購入処理に移行しないようにする事で複数のトランザクションが同時に走ることを避けれます。
これでトランザクションが一つしか走りませんので、意図的にしないと不具合は起こらないはずです。