2011-05-19 10 views
6

Tengo la configuración de compras InApp en mi aplicación. Sin embargo, estoy teniendo un comportamiento extraño. Cada vez que se inicia la aplicación que llamaCola de compra de iPhone inApp no ​​se borrará

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

de configurar el observador inicial. Sin embargo, esto activa inmediatamente

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 

con una matriz completa de cada transacción. He tratado simplemente llamando

[[SKPaymentQueue defaultQueue] finishTransaction: transaction]; 

en cada una de estas transacciones a continuación, reiniciar la aplicación de nuevo, pero todavía paymentQueue se activará tan pronto como lo llamo addTransactionObserver. Mi objetivo principal en este momento es simplemente eliminar la cola de transacciones y comenzar a limpiar. No sé cómo llegué a este estado, ni cómo salir de él.

Respuesta

5

Asegúrese de que ha implementado este método:

-(void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions; 
+1

Podría sugerir lo que sería una buena aplicación práctica? –

+0

@ZivLevy Acabo de registrar todas las transacciones en 'transacciones', así que me hice saber que fueron eliminadas. – DDPWNAGE

3

Poner este lugar para vaciar la cola (posiblemente, su método de carga, pero lo quite en su aplicación final):

for (SKPaymentTransaction* transaction in [[SKPaymentQueue defaultQueue] transactions]) { 
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
} 

Cuando finishTransaction se llama, se llamará al método removeTransaction del observador cuando se mueva cada uno.

Tenía 30 en mi cola y terminé recibiendo 30 llamadas a ese método.

+1

Tiene que usar SKPaymentTransaction en lugar de SKTransaction + falta el punto y coma en la segunda línea. – Rilakkuma

+1

@Rilakkuma voy a editar para arreglar eso – DDPWNAGE

1

Debe asegurarse de finalizar la transacción cada vez que realiza una compra o restaura un producto. Si se encuentra con este problema, debe limpiar su cola y luego desarrollar la lógica de manera apropiada. Se puede obtener una limpieza rápida ejecutando algo como esto en 3. rápido (que es lo mismo que la respuesta anterior). Pero no se supone que sea en tu aplicación real.

func cleanUp() { 

    for transaction in SKPaymentQueue.default().transactions { 

     SKPaymentQueue.default().finishTransaction(transaction) 
    } 
} 

También debe agregar y quitar su observador en la aplicaciónDelegar. Esa es la recomendación y lo mejor para evitar problemas.

0

De SKPaymentTransactionObserver:PaymentQueue.. llamada:

SKPaymentQueue.default().finishTransaction(transaction) 

Tenga en cuenta que no se puede llamar para todos los tipos. Llamar al finishTransaction para .purchasing se bloqueará con error. Por lo tanto, for a través de todas las transacciones no es una solución completa.

Cuando se llama a finishTransaction para .purchasing:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot finish a purchasing transaction' 
0

creo que su problema tiene que ver con las cuentas de usuario recinto de seguridad en iTunes Connect. Si usted no tiene ningún usuario de recinto de seguridad, esta guía fue muy útil para que hagan configuración:
https://support.magplus.com/hc/en-us/articles/203809008-iOS-How-to-Test-In-App-Purchases-in-Your-App

Si tiene Sandbox Usuarios:

Puede intentar llamar finishTransaction: Sin embargo, es necesario asegurarse de que el SKPaymentTransactionState de la transacción es aceptable.

por la documentación sobre finishTransaction:

// Asynchronous. 
// Remove a finished (i.e. failed or completed) transaction from the queue. 
// Attempting to finish a purchasing transaction will throw an exception. 

Así que para eliminar de forma segura las transacciones completadas:

for transaction in SKPaymentQueue.default().transactions { 
    guard 
     transaction.transactionState != .purchasing, 
     transaction.transactionState != .deferred 
    else { 
     //Optionally provide user feedback for pending or processing transactions 
     return 
    } 

    //Transaction can now be safely finished 
    SKPaymentQueue.default().finishTransaction(transaction) 
} 

La documentación sobre .purchasing y .deferred es bastante vaga:

case purchasing // Transaction is being added to the server queue. 

case deferred // The transaction is in the queue, but its final status is pending external action. 

Por lo Entiendo, manejo las transacciones pendientes y/o de procesamiento deben ser bastante pasivas. La aplicación ha hecho todo lo necesario y está esperando una respuesta del servidor de iTunes Store o alguna otra dependencia (es decir, autorización de pago).

paymentQueue: updatedTransactions: recibirán una llamada en la cola SKPaymentTransactionObserver cuando se actualice la transacción.

En cuanto a cómo su cola de transacciones quedó atascada en el limbo, estoy dispuesto a apostar que todas las transacciones en su cola se encuentran en el estado .purchasing. Es muy probable que se trate de un error en los usuarios de iTunes Connect/Sandbox/Production iTunes Accounts. Otros, incluido yo mismo, hemos tenido este problema también. Hay un informe de error archivado. Intente volver a crear/cambiar la contraseña de su usuario de sandbox o cree un nuevo usuario de Sandbox para probar.

Más información aquí: https://forums.developer.apple.com/thread/70418

Cuestiones relacionadas