La misma aplicación, el mismo usuario de testing, dos dispositivos diferentes con diferentes contenidos de SKPaymentQueue. ¿Qué podría causar esto?

Tengo dos iPhones que utilizo para probar mi aplicación.

En el dispositivo A:

NSLog(@"Unfinished Transactions: [%i]", [[SKPaymentQueue defaultQueue].transactions count]); 

Qué resultados: "Transacciones inacabadas: [0]"

Cuando cuando hago a:

 [[SKPaymentQueue defaultQueue] restreCompletedTransactions] 

la function

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

recibe una llamada con 17 elementos en el set de transactions, cada uno marcado como RESTAURADO. Entonces, vuelvo a [[SKPaymentQueue defaultQueue] finishTransaction: transaction] sobre el set y llamo [[SKPaymentQueue defaultQueue] finishTransaction: transaction] en cada uno.

Después de procesar cada artículo, se (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue se llama la (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue , y [[queue transactions] count] of [[queue transactions] count] es igual a 4, no 17, lo cual es una sorpresa.

Si vuelvo a ejecutar [[SKPaymentQueue defaultQueue] restreCompletedTransactions] en este dispositivo, obtengo repetidamente el mismo resultado, pese a haber dicho a cada transacción que lo quiero eliminar de la queue, se invoca updateTransactions con 17 elementos para procesar.

En el dispositivo B,

 $NSLog(@"Unfinished Transactions: [%i]", [[SKPaymentQueue defaultQueue].transactions count]); 

Todavía emite "Transacciones sin terminar: [0]"

Cuando corro

 [[SKPaymentQueue defaultQueue] restreCompletedTransactions] 

, la function

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

NUNCA se llama. Finalmente

 - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 

se llama, con

 [[queue transactions] count] 

igual a 0

¿Qué podría estar causando esto? Es casi como si la queue de pago estuviera vinculada a la ID del dispositivo, no a la ID de Apple de la Cuenta de testing. Además, perdone el terrible formatting de esta pregunta, todavía me estoy acostumbrando a StackOverflow. 🙂

Este es un error de entorno de entorno limitado. He tenido exactamente el mismo problema que el

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

nunca fue llamado Solo el paymentQueueRestoreCompletedTransactionsFinished llegó después de la llamada a restreCompletedTransactions .

Lo he comprobado con un ingeniero de Apple. Confirmó que mi código es correcto y debería recibir la llamada updatedTransactions . Dijo que el hecho de que esto no está sucediendo en el entorno del recinto de security es aparentemente un error (no se sorprendió de nada).

Honestamente, no hay mucho que puedas hacer al respecto. Después de que él confirmó que mi código es correcto, tomé el riesgo y liberé la aplicación. Todo funciona como se esperaba con el server iTunes Connect real.

Por lo tanto, su mejor apuesta (quizás solo) es asegurarse de tener todo configurado según lo esperado y seguir adelante y probarlo contra el server en vivo. ¡Buena suerte! Funcionó para mí.