2012-05-14 7 views
6

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

  1. 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.
  2. 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]; 
} 
+0

ha probado el mismo escenario en el dispositivo? – 8Ours

+0

Sí. El problema ocurre tanto en el dispositivo como en el simulador. – DDRider62

Respuesta

0

¿Está intentando llamar restoreCompletedTransactions cada vez que se inicia la aplicación? Si desea una lista de todas las transacciones que haría un SKProductsRequest

SKProductsRequest *productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productsSet]; 
    productsRequest.delegate = self; 
    [productsRequest start]; 

Si desea obtener los completedTransactions y no son volver todo, por favor, mostrar los registros.

0

Un SKProductsRequest le devolverá una lista de instancias de SKProduct. La clase SKProduct no ha sido, según mi lectura, información comprada. Creo que realmente quiere usar restoreCompletedTransactions y obtener una lista de las instancias de SKPaymentTransaction. Dicho esto, estoy teniendo el mismo problema con una cuenta de espacio aislado. Devuelvo una lista incompleta de transacción (23 de 48). Pero si selecciono comprar un no consumible comprado pero no restaurado, almacene que ya es un artículo comprado y devolverá una restauración para ese artículo.

¿Alguna suerte resolviendo esto?

+0

Ha pasado mucho tiempo, pero creo que no pude resolver el problema. Es (o era en ese momento) un problema con el entorno de la zona de pruebas. – DDRider62

Cuestiones relacionadas