Compensación de las compras de IOS en la aplicación sandbox de compra para un usuario de testing

¿Alguien tiene alguna idea sobre cómo reiniciar y / o borrar el sandbox de compra en la aplicación IOS? Tengo una aplicación que estoy probando con el sandbox, y me gustaría probar nuevas compras sin tener que crear un nuevo usuario de testing cada vez que compre algo. Si no hago esto, entonces (por supuesto) siempre recibo un post que indica que el artículo de compra en la aplicación ya se compró cuando hago clic en el button de compra de mi aplicación.

IMO hay 3 cosas que puede hacer para que las testings no consumibles sean llevaderas:

  1. Puede tener muchas counts de testing 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 : por tester+01@gmail.com tanto, tester+01@gmail.com y tester+02@gmail.com ambos solo van a tester@gmail.com . Probablemente otros hosts de correo electrónico hagan lo mismo. Cuando crea una count de testing, debe introducir: nombre, apellido, dirección de correo electrónico, contraseña, pregunta secreta, respuesta secreta, date de nacimiento y país de la tienda de iTunes. Puedes poner exactamente los mismos datos (incluida la contraseña) para tester+01@gmail.com y tester+02@gmail.com y tendrás dos counts de testing. Finalmente, en su tester@gmail.com input tester@gmail.com , recibirá dos correos electrónicos de verificación de Apple para confirmar ambas counts de testing.

  2. Digamos que tiene un producto no consumible con ID de producto @ "Extra_Levels". En lugar de escribir @ "Extra_Levels" en todos los methods (requestProduct, purchaseProduct, …), simplemente escriba PRODUCT_ID1 y en algún file de encabezado ponga #define PRODUCT_ID1 @"Extra_Levels" (sin punto y coma!), Entonces el preprocesador searchá PRODUCT_ID1 y sustitúyalo por @ "Extra_Levels". Luego, crear un nuevo no consumible llamado @ "Extra_Levels_01" y cambiar la #define será tan bueno como restablecer las compras para todos los usuarios de testing.

  3. Como se muestra en las aplicaciones, puede probar el comportamiento correcto de su código cuando compra un IAP no consumible primero utilizando un IAP consumible (para que el usuario de testing pueda hacer tantas compras como sea necesario) para deshacerse de algunos errores. Por supuesto, también debe probar el código con el IAP real no consumible después de eso.

No puedes hacer esto, por lo que sé. El backend sandbox funciona como una count real: una vez que se compró, se compró (y, por lo tanto, se puede probar la restauración). Debe hacer la mayor parte de su desarrollo con las cosas de la tienda ajustadas, y luego, cuando llegue a probarlo en forma real, simplemente espere crear varias counts de testing.

Tengo 2 en artículos de compra de aplicaciones. 1 para producción. y el otro para testings. cuando necesito "borrar" borro el elemento en la aplicación y creo uno nuevo (15 segundos en itunes connect y 1 segundo para cambiar el identificador del producto en el código)

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

Bueno, técnicamente no necesitas eso.

Si obtiene SKPaymentTransactionStateRestonetworking , es 100% equivalente a la tienda de aplicaciones que verifica al usuario y le otorga la compra. Tengo un cambio como:

 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { for( SKPaymentTransaction *purch in transactions ) { switch( purch.transactionState ) { case SKPaymentTransactionStateRestonetworking: 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 la aplicación / recuperar la compra es simple: si está guardando compras en un llavero, borre su llavero. Si lo estás haciendo de otra manera, simplemente cambia el estado de tu aplicación local para fingir que el usuario nunca lo compró antes. El cuadro de dialog de request de compra sigue siendo exactamente el mismo, la única diferencia es cuando SKPaymentTransactionStateRestonetworking SÍ, le proporciona SKPaymentTransactionStateRestonetworking lugar de SKPaymentTransactionStatePurchased .

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

SimStoreKit almacena compras en los valores pnetworkingeterminados del usuario bajo la key ILSimSKTransactions . Para borrar todas las compras que puedes hacer:

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

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

Utilicé con éxito SimStoreKit para depurar el frente de la tienda de mi aplicación antes de probar con sandbox. La belleza de esta biblioteca es que puede configurarse para usar los mismos nombres de class que el verdadero marco StoreKit (haciendo #define ILSimReplaceRealStoreKit 1 antes de hacer #include <ILSimStoreKit.h> ).

En los files fuente donde necesito acceder a StoreKit, incluyo este file 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 corro en el dispositivo.

La eliminación de su aplicación y la reinstallation también funciona para las testings de sandbox. Depende de la aplicación obviamente, pero estoy probando una aplicación basada en suscripción que solo compras durante el logging en este momento, así que ha sido la solución más fácil.

Simplemente siga usando la misma count de testing, restaurando las compras en lugar de completar otras nuevas. Después de todo, ya sea que comience una nueva compra o restablezca una anterior, SU APLICACIÓN hará lo mismo (al less inicialmente, tal vez la interfaz de usuario se actualizará de manera diferente al finalizar). Apple son las personas que manejan las cosas de manera diferente en esas diferentes situaciones: no te preocupes por eso.

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

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

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

Al final, debido a que la mayoría de nosotros somos obsesivo-compulsivos en diferentes grados, hacemos una testing final con una count nueva (no es un gran problema hacer una segunda para la certeza absoluta).

Lo último a tener en count: considere la position de la manzana. Si hubiera un problema con los desarrolladores que tuvieran que perder time creando decenas o cientos de counts para probar a background el IAP, habrían resuelto el problema. No hay ningún problema.

No es realmente una respuesta, pero ayuda a explicar.

Pensé que ya que el file tenía que downloadse, que tal vez podría ser eliminado. La function simple a continuación intenta que (Swift 3.0):

 func removeReceipt() { if let receiptURL = Bundle.main.appStoreReceiptURL { print("receipt URL: \(receiptURL)") do { try FileManager.default.removeItem(at: receiptURL) print("Success") } catch let error as NSError { print("ERROR: \(error.localizedDescription)") } } } 

Obtuve la siguiente respuesta:

URL de recepción: file: /// private / var / mobile / Containers / Data / Application / 7A2-App-Related-Number-67 / StoreKit / sandboxReceipt

ERROR: "sandboxReceipt" no se pudo eliminar porque no tiene permiso para acceder a él.

Aunque el código muestra que extrae el recibo del package de aplicaciones, pensé que el package era estático, por lo que el recibo todavía podría ser eliminable. Estoy seguro de que hay razones de security por las que todo funciona de esta manera, por lo que terminó teniendo que eliminar la aplicación para volver a probar el caso de no pasar de recibo a nuevo recibo descargado.

Las compras son transactions sin terminar. Todo lo que necesita hacer para las testings solo termínelos.

 for (SKPaymentTransaction *transaction in [SKPaymentQueue defaultQueue].transactions) [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 

como alternativa para crear una solución de usuario de testing múltiple, puede crear varias testings en las compras de aplicaciones en iTunes connect, entonces no necesita cambiar una count de usuario.