Elaborating on Shawn's answer, in - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
you probably have some code like this:
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
for (SKPaymentTransaction *transaction in transactions)
{
switch (transaction.transactionState)
{
case SKPaymentTransactionStatePurchased:
[self completeTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
[self failedTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
[self restoreTransaction:transaction];
default:
break;
}
}
}
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
/* Handle restore here */
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
You can handle nil productIdentifiers in restoreTransaction:
by adding a check to see if the productIdentifier is nil, like this:
- (void) restoreTransaction: (SKPaymentTransaction *)transaction
{
if (!transaction.originalTransaction.payment.productIdentifier) {
NSLog(@"productIdentifier is nil; Apple bug?");
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
return;
}
/* Handle restore here */
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
This technique fixed the problem for me in my app. The app started, logged "productIdentifier is nil; Apple bug?" and didn't crash. When I then manually re-restored transactions, Apple sent a valid transaction, and the app worked as designed.