Sincronización de una compra in-app de consumibles con un server

Estoy tratando de descubrir la mejor manera de garantizar que un usuario no pierda su consumible en la compra de la aplicación.

Sin embargo, estoy empezando a sentirme como este usuario de StackOverflow .

Después de una transacción completa, quiero enviar a un server que el usuario compró un consumible en la aplicación. Sin embargo, la connection puede fallar en ese momento (el server está inactivo o el usuario pierde la connection).

Estaba considerando en ese escenario enviar el recibo tan pronto como se pueda volver a hacer la connection. Sin embargo, por lo que he leído, el recibo contiene todas las compras de la aplicación y no puedo enviar solo el recibo del último artículo comprado.

¿Cómo puedo garantizar que la compra realizada por el usuario se haya sincronizado con el server?

La solución es no llamar

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

en la compra de consumibles hasta que se haya sincronizado con el server. De esta manera, la transacción será entregada nuevamente a su observador cada vez que se establece para observar la queue de pago. Necesitarás administrar lado de la aplicación ya sea una compra que se haya entregado pero no se haya sincronizado o una compra nueva.

Una vez que haya sincronizado la transacción con el server. Puedes llamar -finishTransaction: Consulte la sección "Cómo finalizar la transacción" en los documentos aquí:

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW3

EDITAR

Entonces el usuario es cargado por Apple, y Apple le envía un object SKPaymentTransaction que representa la transacción. Si la propiedad transactionState de esa transacción es SKPaymentTransactionStatePurchased , significa que Apple ha procesado el pago y el usuario ha cobrado.

Una vez que haya recibido este object SKPaymentTransaction de paymentQueue, entregará el contenido al usuario y sincronizará la transacción con su server. Una vez que ambos se hayan completado con éxito, se llama -finishTransaction . Al llamar -finishTransaction le dice a StoreKit que ha completado con éxito todo lo que necesita hacer. -finishTransaction es una llamada síncrona , le está devolviendo la responsabilidad a StoreKit , y no necesita preocuparse por la forma en que se lo comunica a iTunes / Apple, StoreKit maneja todo por usted.

No debe llamar -finishTransaction hasta que haya hecho todo lo que necesita hacer. Si algo falla (la batería del dispositivo muere, la pérdida de connection a Internet, la aplicación se bloquea), se le entregará la misma SKPaymentTransaction de la queue de pago la próxima vez que su observador esté registrado en la queue y pueda intentar sincronizarlo nuevamente con su server. Esto seguirá sucediendo hasta que llame -finishTransaction .

Hay un escenario en el que el usuario nunca puede sincronizar con su server, nunca se conecta a Internet nuevamente, etc. Eso está fuera de su control, y en ese momento es responsabilidad de Apple decidir si le cobran al usuario.

También vale la pena señalar que el usuario puede ponerse en contacto con Apple y solicitar un reembolso si así lo desean.