iPhone アプリケーションの開発中に、restoreCompletedTransactions にかなりの問題があります。以下に示すすべての問題は、サンドボックス環境で作業しているときに発生します。アプリはまだ販売されていません。シミュレーター 5.0 および 5.1 で実行される Xcode 4.3.2 で開発されています。私が得る問題は次のとおりです。
- アプリケーションが起動し、addTransactionObserver への呼び出しが行われるたびに、updatedTransactions が呼び出され、トランザクションが購入されます。コールバックごとに、私のコードは finishTransaction: を呼び出して購入を完了しますが、アプリケーションを起動するたびにこの問題が発生し続けます。まったく同じ購入の確認が入ります。
- [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] を呼び出しても、そのアカウントで購入したすべての非消耗品が一覧表示されるわけではありません。非消耗品を 2 回購入しましたが、毎回 1 つしか返品されません。リストにないアイテムを購入しようとすると、そのアイテムが既に購入されていることを示すメッセージが表示されます。リストにないアイテムは、問題 1 (上記のリスト) が発生するアイテムではありません。
この時点で、私は完全に立ち往生しています。私のアプリケーションは、非消耗品に関する情報を返すために AppStore に依存しています。これは、このデータを独自のサーバーに保存していないためです。ただし、AppStoreKit が購入したすべてのアイテムを含むリストを返すことを確認する必要があります。一部だけではありません。
これは、restoreCompletedTransactions をテストするために使用している関連コードです。
- (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
NSLog(@"updatedTransactions started. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
NSLog(@"Number of transactions received: %d.", [transactions count]);
int count = 0;
for (SKPaymentTransaction *trans in transactions)
{
NSLog(@"Data for transaction %d: ", ++count);
NSString *transId = [trans transactionIdentifier];
switch ([trans transactionState])
{
case SKPaymentTransactionStatePurchasing:
NSLog(@"Purchasing transaction: %@", transId);
if (transId == nil)
{
NSLog(@" Original transaction Id: %@", [[trans originalTransaction] transactionIdentifier]);
}
NSLog(@" No action taken in update");
break;
case SKPaymentTransactionStateFailed:
NSLog(@"Purchase transaction failed for transaction %@", transId);
NSLog(@" Error %d (%@)", [[trans error] code], [[trans error] localizedDescription]);
NSLog(@" Action Taken: finish transaction.");
[queue finishTransaction: trans];
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"Purchased transaction %@", transId);
NSLog(@" Purchased qty %d of product %@", [[trans payment] quantity], [[trans payment] productIdentifier]);
NSLog(@" Action: called [queue finishTransaction:] to complete purchase");
[queue finishTransaction: trans];
break;
case SKPaymentTransactionStateRestored:
{
SKPayment *paym = [trans payment];
SKPaymentTransaction *origTrans = [trans originalTransaction];
SKPayment *origPayment = [[trans originalTransaction] payment];
NSLog(@"Transaction restored: %@ with original transaction %@", transId, [[trans originalTransaction] transactionIdentifier]);
NSLog(@" TRANSACTION DATA:");
NSLog(@" purchased %d of product %@ on %@.",
[paym quantity],
[paym productIdentifier],
[[trans transactionDate] description]);
NSLog(@" ORIGINAL TRANSACTION DATA:");
NSLog(@" purchased %d of product %@ on %@.",
[origPayment quantity],
[origPayment productIdentifier],
[[origTrans transactionDate] description]);
NSLog(@" No action taken.");
break;
}
default:
NSLog(@"Unexpected transaction state: %d", [trans transactionState]);
NSLog(@" No action taken.");
break;
}
}
NSLog(@"");
NSLog(@"updatedTransactions ended. -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ");
}
- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
NSLog(@"Restore completed transactions finished.");
NSLog(@" Number of transactions in queue: %d", [[queue transactions] count]);
for (SKPaymentTransaction *trans in [queue transactions])
{
NSLog(@" transaction id %@ for product %@.", [trans transactionIdentifier], [[trans payment] productIdentifier]);
NSLog(@" original transaction id: %@ for product %@.", [[trans originalTransaction] transactionIdentifier],
[[[trans originalTransaction] payment]productIdentifier]);
}
NSLog(@"");
}
// Method to restore transactions when user clicks button in application
- (void) onRestoreCompletedTransactions:(id)sender
{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}