ios objective-c in-app-purchase ios8 xcode6

ios - ¿Cómo probar SKPaymentTransactionStateDeferred?



objective-c in-app-purchase (5)

Al crear una cuenta infantil según la respuesta de Chris Prince , asegúrese de establecer su "edad" entre los 13 y los 18 años. Si lo configura en menos de 13, no puede verificar su antigüedad (incluso si agrega una tarjeta de crédito a su cuenta P). Si está por encima de 18, la opción para habilitar Preguntar para comprar se ha ido. Pasé horas intentando averiguar qué estoy haciendo mal.

Además, debe crear una cuenta C a través de iTunes Connect, no a través de la opción "Crear cuenta infantil" en la pantalla para compartir en familia.

Ojalá pudiera comentar, pero como no tengo 50 puntos de reputación, tengo que crear una respuesta por separado.

iOS 8 se lanzará pronto. Tenemos Xcode beta 6 atm, pero aún no podemos encontrar ningún documento sobre cómo probar adecuadamente el intercambio familiar (¿o perdí algo?). Mi pregunta es ¿cómo configurar correctamente Sandbox con padre / hijo? Intenté hacerlo funcionar en beta 1 sin alegría.

¿Alguna pista chicos?

Actualizar:

Dos historias relacionadas en el Foro de desarrolladores de Apple:

  1. ¿Cómo crear una cuenta de sandbox para niños en iTunes Connect? ( https://devforums.apple.com/message/1030357#1030357 )
  2. Prueba "Preguntar para comprar" en la caja de arena ( https://devforums.apple.com/message/1005569#1005569 )


He avanzado un poco en este tema, así que pensé en informar. Además, encontré un error aparente, que informé a Apple.

Lo que he hecho es lo siguiente:

1) Cree una cuenta de prueba principal (sandbox) en iTunes Connect y cree una cuenta de prueba secundaria. Estas son realmente solo dos cuentas de prueba en iTunes Connect. Llámalos P y C para padres e hijos.

2) Con ambas cuentas, vaya a https://appleid.apple.com y cambie su año para su edad. iTunes Connect no te permite hacer esto. Por alguna razón, el proceso de compartir familia no funciona a menos que las edades tengan un año. Descubrí que tiene que hacer la selección dos veces en la lista de años en https://appleid.apple.com . Impar. Establecí mi P como mayor (algunos adultos) y mi C como más joven.

3) En un dispositivo Apple (mi iPhone, con iOS8), configuro la familia para compartir en Configuración> iCloud para la cuenta P. He iniciado sesión en iTunes en este dispositivo con mi ID de Apple de iTunes real (que tiene mi información de pago).

4) Luego invito a mi ID de Apple C a formar parte de mi familia, en Configuración> iCloud.

5) Acepto la invitación de P (en mi iPad, que también ejecuta iOS8), que implica iniciar sesión en iCloud en ese otro dispositivo como C.

6) En mi iPhone, enciendo "Pedir compra" para el miembro de la familia C.

Ahora, estoy listo para probar una compra de prueba como C en mi aplicación de espacio aislado. Después de pasar por el proceso regular en la tienda de mi aplicación, recibo la siguiente alerta:

cuando hago clic en "Preguntar", aparece la siguiente alerta:

Ahora, he probado dos opciones, con compras separadas. He intentado la opción "OK", que debería enviar una notificación a la cuenta P. Todavía no he recibido una notificación de este tipo en mi cuenta P (aún estoy registrado en iCloud como en mi iPad).

También probé la opción "Aprobar en persona" en el iPad del "niño". Utilizo la cuenta P, y entro en eso si en la próxima alerta:

No recibo ningún error después de eso, por lo que parece que la Aprobación en persona funcionó, pero aún no he hecho que esa compra se convierta al estado SKPaymentTransactionStatePurchased. Todas las compras diferidas aún se encuentran en la cola de pago de la aplicación, cada una con el estado SKPaymentTransactionStateDeferred. Cuando reinicio la aplicación, el estado de cada compra, aún en la cola, se difiere.

Luego, me pregunté si había algún problema con la cuenta de iTunes de la prueba en particular, así que hice una segunda cuenta secundaria, la llamé C2 y traté de establecerla como una niña con P en mi iPhone. Sin embargo, me encuentro con un problema adicional allí. Recibo la alerta (en el iPad), cuando trato de aceptar la invitación para ser miembro de la familia bajo P para C2:

Para mí, esta limitación en la cuenta de iCloud no debería aplicarse a las cuentas de prueba. Este es el error aparente que he reportado a Apple.

Entonces, en resumen, aún no estoy 100% convencido de que mi implementación SKPaymentTransactionStateDeferred esté funcionando. Veremos si Apple vuelve a llamarme.


Resulta que parece que el entorno de sandbox no es compatible con la relación padre-hijo, por lo que los mensajes no se enviarán cuando las cuentas en cuestión se configuren como se menciona en la respuesta de @ChrisPrince.

El artículo que desenterré se puede encontrar aquí: https://forums.developer.apple.com/thread/38561#117143

El fragmento de importancia de la respuesta del miembro del personal de Apple es

En lo que respecta al soporte Ask-To-Buy, no hay soporte para esta función en el Sandbox. "Pedir para comprar" no es una implementación de API, sino un proceso de soporte implementado por iTunesConnect que requiere la interacción de StoreKit con una cuenta específica de iTunes. Este soporte solo existe en el entorno de producción. Para que este proceso funcione en el entorno de sandbox, ITC tendría que implementar para que las cuentas de prueba se refieran a otras cuentas para otorgar la aprobación para las compras.

El resto del artículo destaca las directrices y los flujos para el soporte de "Comprar para comprar", pero las pruebas deben realizarse en el entorno de producción donde la relación de la cuenta de niño / padre está activa.


iOS 9.2.1, Xcode 7.2.1, ARC habilitado

¡Confirmado! La propiedad simulatesAskToBuyInSandbox no hace que el observador de la cola de pagos registre el estado SKPaymentTransactionStateDeferred . En su lugar, simplemente procesa el pago y el observador registra el estado SKPaymentTransactionStatePurchased .

SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:productUserRequested]; payment.simulatesAskToBuyInSandbox = true; [[SKPaymentQueue defaultQueue] addPayment:payment];

La única prueba que pude realizar fue llamar a mi método para el pago diferido cuando el observador registró el estado SKPaymentTransactionStatePurchased lugar de mi método habitual y no llamar:

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

Esto persiste la transacción en la aplicación. finalización, y le brinda la posibilidad de probar que el usuario no está completando la compra (por ejemplo, la pérdida de la recepción durante las etapas finales de la compra) y la compra diferida. Esto es asumiendo que su método de compra pasa un parámetro diferido, como se describe en el Listado 4-2 Respondiendo a los estados de transacción en la Guía de compras en la aplicación: Entrega de productos . Aquí es cómo se vería el método:

Para simular colgar comprando:

[self showTransactionAsInProgress:transaction deferred:NO];

Para simular diferido:

[self showTransactionAsInProgress:transaction deferred:YES];

Nota: Sobre la aplicación. reiniciar, la Apple en la aplicación. el mecanismo de compra le pedirá sus credenciales si no procesó ningún otro pago por las credenciales, no desinstaló la aplicación o se desconectó de "iTunes and App Stores" en "Configuración". Además, si toca "Cancelar" aquí, entonces la transacción no fallará, ya que el observador de la cola de pagos seguirá registrando el estado SKPaymentTransactionStatePurchased .

ACTUALIZACIÓN 03/04/2016:

Encontré esta sugerencia de Apple que podría resultar útil, es una forma elegante de hacer lo que sugerí:

Probar una transacción interrumpida

Establezca un punto de interrupción en el método de pago de la cola de transacciones del observadorQueue: updatedTransactions: para que pueda controlar si entrega el producto. Luego realice una compra como de costumbre en el entorno de prueba y use el punto de interrupción para ignorar temporalmente la transacción; por ejemplo, al regresar del método de inmediato con el comando de retorno de subproceso en LLDB.

Termine y reinicie su aplicación. El Kit de tienda llama al método paymentQueue: updatedTransactions: nuevamente poco después del lanzamiento; Esta vez, deja que tu aplicación responda normalmente. Verifique que su aplicación entregue correctamente el producto y complete la transacción.

¡Espero que esto ayude! Aclamaciones.