Eliminación de compras desde la zona de pruebas de compra en la aplicación de iOS para un usuario de prueba

116

¿Alguien tiene alguna idea sobre cómo restablecer y / o borrar la zona de pruebas de compra en la aplicación de iOS?

Tengo una aplicación que estoy probando con la caja de arena y me gustaría probar nuevas compras sin tener que crear un nuevo usuario de prueba cada vez que compro algo.

Si no hago esto, entonces (por supuesto) siempre recibo un mensaje de que el artículo de compra en la aplicación ya se compró cuando hago clic en el botón de compra de mi aplicación.

RandomIOSDeveloper
fuente

Respuestas:

75

En mi opinión, hay 3 cosas que puede hacer para que las pruebas de los no consumibles sean soportables:

  1. Puede tener muchas cuentas de prueba asociadas a un correo electrónico. Gmail, por ejemplo, le permite agregar una cadena "más" al correo electrónico para crear alias para una dirección : entonces [email protected]y [email protected]ambos realmente simplemente van a [email protected]. Probablemente otros hosts de correo electrónico hagan lo mismo. Cuando crea una cuenta de prueba, debe introducir: nombre, apellido, dirección de correo electrónico, contraseña, pregunta secreta, respuesta secreta, fecha de nacimiento y país de la tienda iTunes. Puede poner exactamente los mismos datos (incluida la contraseña) para [email protected]y [email protected]y tendrá dos cuentas de prueba. Finalmente, en su [email protected]bandeja de entrada recibirá dos correos electrónicos de verificación de Apple para confirmar ambas cuentas de prueba.

  2. Supongamos que tiene un producto no consumible con ID de producto @ "Extra_Levels". En lugar de escribir @ "Extra_Levels" en todos los métodos (requestProduct, purchaseProduct, ...), simplemente escriba PRODUCT_ID1y en algún archivo de encabezado coloque #define PRODUCT_ID1 @"Extra_Levels"(¡sin punto y coma!), El preprocesador buscará PRODUCT_ID1 y lo sustituirá por @ "Extra_Levels". Luego, crear un nuevo no consumible llamado @ "Extra_Levels_01" y cambiar el #define será tan bueno como restablecer las compras para todos sus usuarios de prueba.

  3. Como señaló Appsmatics, puede probar el comportamiento correcto de su código cuando compra un IAP no consumible utilizando primero un IAP consumible (para que el usuario de prueba pueda realizar tantas compras como necesite) para deshacerse de algunos errores. Por supuesto, también debe probar el código con el IAP real no consumible después de eso.

Roberto Canogar
fuente
17
Vaya, nunca supe de esta función súper secreta de Gmail. ¡Qué util!
bobobobo
4
Me acabo de enterar de que no es necesario que verifique el correo electrónico de su usuario de prueba. simplemente puede poner [email protected] con la contraseña especificada (que todavía va a usar la contraseña en el modo sandbox) y seguirá funcionando. Lo probé anoche.
antes
3
El truco PLUS SIGN para los alias de correo electrónico no es solo una cuestión de GMail. Es una tradición muy antigua entre los servidores de correo electrónico, que se remonta a décadas. Pero nunca se incorporó a ninguna especificación de correo electrónico. Por lo tanto, pruébelo con su servidor de correo electrónico en particular para asegurarse de que esté familiarizado con esta función.
Basil Bourque
2
No creo que sea imposible borrar las compras dentro de la aplicación para la cuenta de prueba;) Viva Apple :)
Bartłomiej Semańczyk
12
+Las direcciones de correo electrónico ya no se pueden utilizar para registrarse en Apple ID.
pkamb
32

No puedes hacer esto, hasta donde yo sé. El backend de la caja de arena funciona como una cuenta real: una vez que se compra, se compra (y por lo tanto, puede probar la restauración). Debería hacer la mayor parte de su desarrollo con el material de la tienda eliminado, y luego, cuando llegue a probarlo de verdad, solo espere crear varias cuentas de prueba.

Ben Zotto
fuente
3
De acuerdo con Samvermette, es una locura que las pruebas funcionen tan cerca de una tienda real. Debe haber al menos una forma de borrar las compras en la caja de arena. Para realizar varias compras para el mismo usuario con el fin de realizar pruebas, agregué también un tipo de consumible.
appsmatics
4
@samvermette La única diferencia es que SKPaymentTransactionStateRestoredregresa de la tienda de aplicaciones, en lugar de SKPaymentTransactionStatePurchased. Dado que aquí no está usando dinero real, para todos los efectos, SKPaymentTransactionStateRestoredes 100% equivalente a las SKPaymentTransactionStatePurchasedpruebas. Restablecer el estado de su aplicación a "no comprado" realmente depende de usted (simplemente elimine la entrada de llavero relevante o lo que esté usando para almacenar en caché ese "usuario compró X")
bobobobo
10

Tengo 2 artículos de compra en la aplicación. 1 para producción. y el otro para probar. cuando necesito "borrar", elimino el elemento de la aplicación y creo uno nuevo (15 segundos en iTunes Connect y 1 segundo para cambiar la identificación del producto en el código)

Si no necesito probar "nuevo usuario", uso la producción en el elemento de la aplicación.

usuario1105951
fuente
Sí, hacer una nueva copia del producto y cambiar el nombre del producto en el código (presumiblemente habiéndolo definido como #) parece, con mucho, la solución más fácil para realizar pruebas realistas.
JulianSymes
7

Bueno, técnicamente no lo necesitas.

En caso de conseguirlo SKPaymentTransactionStateRestored, es 100% equivalente a que la tienda de aplicaciones verifique al usuario y le conceda la compra. Tengo un interruptor como:

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
  for( SKPaymentTransaction *purch in transactions )
  {
    switch( purch.transactionState )
    {
      case SKPaymentTransactionStateRestored:
        info( "PURCHASE RESTORE" ) ;
        // fall thru
      case SKPaymentTransactionStatePurchased:
        [[SKPaymentQueue defaultQueue] finishTransaction:purch];
        // Do regular changes to app state for this purchase,
        // register in keychain, etc.
        break ;

       //.. other cases
     }
  }
}

La cuestión de tener la lógica de su aplicación / recuperar la compra es simple: si está almacenando en caché las compras en el llavero, elimine su llavero. Si lo está haciendo de otra manera, simplemente cambie el estado de su aplicación local para simular que el usuario nunca la compró antes. El cuadro de diálogo de solicitud de compra sigue siendo exactamente el mismo, la única diferencia es que cuando pulsas SÍ, te da en SKPaymentTransactionStateRestoredlugar de SKPaymentTransactionStatePurchased.

bobobobo
fuente
5

La eliminación y reinstalación de la aplicación también funciona para las pruebas de sandbox. Depende de la aplicación, obviamente, pero estoy probando una aplicación basada en suscripción que solo compra durante el registro en este momento, por lo que ha sido la solución más fácil.

Christopher Larsen
fuente
3

Echa un vistazo a SimStoreKit . Es una "versión simulada del StoreKit del iPhone, para probar la interfaz de usuario de la tienda en el iPhone Simulator, o incluso en el dispositivo sin tener que configurar IAP en Connect".

SimStoreKit almacena las compras en los valores predeterminados del usuario bajo la clave ILSimSKTransactions. Entonces, para borrar todas las compras que puede hacer:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"ILSimSKTransactions"]

En el simulador, simplemente puede eliminar su aplicación e instalarla nuevamente.

He utilizado con éxito SimStoreKit para depurar el frente de la tienda de mi aplicación antes de probar con la caja de arena. La belleza de esta biblioteca es que se puede configurar para usar los mismos nombres de clase que el marco StoreKit real (haciendo #define ILSimReplaceRealStoreKit 1antes de hacerlo #include <ILSimStoreKit.h>).

En los archivos de origen donde necesito acceder a StoreKit, incluyo este archivo de encabezado:

#import <TargetConditionals.h>

#if TARGET_IPHONE_SIMULATOR
    #define kILSimAllowSimulatedStoreKit 1
    #define ILSimReplaceRealStoreKit 1
    #import <ILSimStoreKit.h>
#else
    #import <StoreKit/StoreKit.h>
#endif

Esto tiene el efecto de usar SimStoreKit cuando ejecuto en el simulador y el StoreKit real cuando ejecuto en el dispositivo.

Emile Cormier
fuente
No pude hacer que esto funcione. Recibo un error de compilación. Copié todos los archivos en el zip en mi proyecto y reemplacé todo el #import <StoreKit / StoreKit.h> con #define ILSimReplaceRealStoreKit 1 #import "ILSimStoreKit.h"
Jay Q.
Solo necesita los archivos que comienzan con ILSimSK. El resto es para la aplicación de demostración. Quizás debería publicar una pregunta con el error exacto que está recibiendo. "Recibo un error de compilación" no dice mucho.
Emile Cormier
-1

Alternativamente, para crear una solución de múltiples usuarios de prueba, puede crear múltiples pruebas en compras de aplicaciones en iTunes Connect, entonces no necesita cambiar una cuenta de usuario.

Adobels
fuente
1
Los motivos de los votos negativos son: 1. No es una buena solución, ya que puede estar intentando probar una solución de compra en la aplicación específica que puede requerir muchos escenarios con inicio de sesión de usuario de la aplicación y disponibilidad de contenido entre dispositivos / plataformas. 2. Es tan (de hecho más) tedioso crear varias compras de prueba como crear varias cuentas de prueba. 3. Además, la respuesta no está muy bien formateada.
mickeymoon
-1

Simplemente siga usando la misma cuenta de prueba, restaurando compras en lugar de completar otras nuevas. Después de todo, ya sea que inicie una nueva compra o restaure una anterior, SU APLICACIÓN hará lo mismo (al menos inicialmente, tal vez la interfaz de usuario se actualice de manera diferente al finalizar). Apple es la gente que maneja las cosas de manera diferente en esas diferentes situaciones, no se preocupe por eso.

Coloque su lógica de entrega en el caso SKPaymentTransactionStateRestored dentro de la implementación de este método para la prueba:

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

Luego, asegúrese de incluir esa lógica de entrega en el caso SKPaymentTransactionStatePurchased.

Al final, debido a que la mayoría de nosotros somos obsesivos-compulsivos en diversos grados, haga una prueba final con un relato nuevo (no es gran cosa hacer un segundo con absoluta certeza).

Lo último a tener en cuenta: considere la posición de Apple. Si hubiera un problema con los desarrolladores que tuvieran que perder tiempo creando decenas o cientos de cuentas para probar IAP a fondo, habrían resuelto el problema. No hay ningún problema.

ArthurVonBabilonia
fuente