Estoy teniendo problemas con restaurarCompletedTransactions al desarrollar una aplicación de iPhone. Todos los problemas enumerados a continuación ocurren cuando se trabaja en el entorno de recinto de seguridad. La aplicación aún no se está vendiendo. Se está desarrollando con Xcode 4.3.2 ejecutándose en el simulador 5.0 y 5.1. Los problemas que tengo son:restoreCompletedTransactions devuelve información incompleta en el entorno de sandbox
- Cada vez que se inicia la aplicación y se realiza la llamada para agregarTransactionObserver, se invoca Transactions actualizado con una transacción que se está adquiriendo. En cada devolución de llamada mi código llama a finishTransaction: para completar la compra, y sin embargo, este problema sigue sucediendo cada vez que inicio la aplicación. Aparecerá una confirmación para la misma compra.
- Invocando [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] no se mostrarán todos los artículos no consumibles comprados con la cuenta. Tengo 2 compras de artículos no consumibles y solo 1 se devuelve cada vez. Si trato de comprar el artículo que falta en la lista, recibiré un mensaje que indica que el artículo ya se ha comprado. El elemento que falta en la lista NO es aquel para el que recibo el problema 1 (mencionado anteriormente).
En este punto estoy completamente atascado. Mi aplicación depende de la AppStore para devolver información sobre no consumibles, ya que no estamos guardando esta información en nuestros propios servidores. Pero debemos asegurarnos de que AppStoreKit devuelva la lista con TODOS los artículos comprados. No solo algunos
Aquí está el código correspondiente que estoy utilizando para probar 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];
}
ha probado el mismo escenario en el dispositivo? – 8Ours
Sí. El problema ocurre tanto en el dispositivo como en el simulador. – DDRider62