¿Debo llamar a finishTransaction cuando falla la verificación del recibo de server?

Uso la verificación del recibo del lado del server.

Cuando el cliente

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

se llama y transactionState es SKPaymentTransactionStatePurchased , el cliente envía el recibo a nuestro server y nuestro server lo verifica.

Cuando la verificación de recepción del lado del server se realiza correctamente, el cliente obviamente llama a finishTransaction , no hay problema.

Cuando falla la verificación de recibo del lado del server, porque Apple no devolvió temporalmente json, o recibo inválido enviado por el cliente, o algo así, el server devuelve esa información al cliente.

Luego, ¿qué debe hacer nuestro cliente? ¿Deberíamos llamar a finishTransaction ?

¿Esto lleva a transactions inválidas que viven para siempre en la queue? como se dijo en esta pregunta: compra de iPhone en la aplicación: verificación de recibo

Pero si descubre que un recibo no es válido, debe finalizar la transacción asociada. De lo contrario, puede que las transactions extra vivan para siempre en la queue de transactions. Eso significa que cada vez que se ejecuta su aplicación, paymentQueue: updatedTransaction: se llamará una vez por transacción …

Pero si terminamos finishTransaction , nuestro valioso usuario recibe este recibo (que no pudimos verificar), ¿verdad?

¿O la transacción verify-failed-expira en algún período?

¿Está documentado esto en algún lugar del documento de Apple? No pude encontrar ninguna en http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html

Sí, tienes que terminarTransaction.

Depende de usted si le da al usuario lo que quiere entonces. En algunos casos, es mejor darle al usuario lo que quiera, incluso si el recibo es inválido o falso (usando jailbreak). Especialmente cuando no cuesta nada.

Termino la transacción para eliminarla de la queue, pero no proporciono el contenido adicional si la validation falla. Si es un recibo inválido, entonces Apple no les cobró. Si resulta ser otra cosa, como que el server de verificación de Apple esté temporalmente inactivo, se habrán cobrado y, cuando intenten restaurar las compras (o lo vuelvan a agregar), no se cobrarán nuevamente y su aplicación obtendrá Otra oportunidad para verificar el recibo.

Si la verificación falla por una razón técnica, como que el server de Apple está funcionando, será incómodo, pero no hay otra forma de evitar que alguien robe su contenido. La buena noticia es que puedes dejar que el usuario sepa en una window emergente si el server de Apple está inactivo y que deberían volver a intentarlo más tarde y, lo más importante, que no se volverán a cargar.