Cancellazione degli acquisti dalla sandbox degli acquisti in-app iOS per un utente di prova


116

Qualcuno ha qualche idea su come ripristinare e / o cancellare la sandbox degli acquisti in-app iOS?

Ho un'app che sto testando con la sandbox e vorrei provare i nuovi acquisti senza dover creare un nuovo utente di prova ogni volta che acquisto qualcosa.

Se non lo faccio, (ovviamente) ricevo sempre un messaggio che l'articolo di acquisto in-app è già stato acquistato quando faccio clic sul pulsante di acquisto della mia app.

Risposte:


75

IMO ci sono 3 cose che puoi fare per rendere sopportabili i test non consumabili:

  1. Puoi avere molti account di prova associati a una email. Gmail, ad esempio, ti consente di aggiungere una stringa "più" all'email per creare alias per un indirizzo : quindi tester+01@gmail.comed tester+02@gmail.comentrambi vanno semplicemente a tester@gmail.com. Probabilmente altri host di posta elettronica fanno lo stesso. Quando crei un account di prova devi introdurre: nome, cognome, indirizzo e-mail, password, domanda segreta, risposta segreta, data di nascita e paese di iTunes Store. Puoi inserire esattamente gli stessi dati (inclusa la password) per tester+01@gmail.come tester+02@gmail.come avrai due account di prova. Infine, nella tua tester@gmail.comcasella di posta riceverai due email di verifica da Apple per confermare entrambi gli account di prova.

  2. Supponi di avere un prodotto non consumabile con ID prodotto @ "Extra_Levels". Invece di scrivere @ "Extra_Levels" in tutti i metodi (requestProduct, purchaseProduct, ...), scrivi PRODUCT_ID1e in un file di intestazione metti #define PRODUCT_ID1 @"Extra_Levels"(senza punto e virgola!), Quindi il preprocessore cercherà PRODUCT_ID1 e lo sostituirà con @ "Extra_Levels". Quindi creare un nuovo non consumabile chiamato @ "Extra_Levels_01" e modificare #define equivale a reimpostare gli acquisti per tutti gli utenti di prova.

  3. Come ha sottolineato appsmatics, puoi testare il comportamento corretto del tuo codice quando acquisti un IAP non consumabile utilizzando prima un IAP consumabile (in modo che l'utente di prova possa effettuare tutti gli acquisti necessari) per sbarazzarsi di alcuni bug. Ovviamente, dovresti anche testare il codice con il vero IAP non consumabile dopo di che.


17
Wow, non ho mai saputo di questa funzionalità di Gmail super segreta. Quanto utile!
bobobobo

4
Ho appena scoperto che non è necessario verificare l'email dell'utente di prova. puoi semplicemente inserire 123@123.com con la password specifica (che utilizzerai ancora la password in modalità sandbox) e funziona ancora. Ho fatto il test ieri sera.
presto

3
Il trucco del SEGNO PIÙ per gli alias di posta elettronica non è solo una cosa di Gmail. È una tradizione molto antica tra i server di posta elettronica, che risale a decenni fa. Ma non è mai stato incorporato nelle specifiche delle e-mail. Quindi, provalo con il tuo particolare server di posta elettronica per assicurarti che sia esperto con questa funzione.
Basil Bourque

2
Non penserei che sia impossibile cancellare gli acquisti in-app per l'account di prova;) Viva Apple :)
Bartłomiej Semańczyk

12
+gli indirizzi e-mail non possono più essere utilizzati per registrarsi per gli ID Apple.
pkamb

32

Non puoi farlo, per quanto ne so. Il backend sandbox funziona come un account reale: una volta acquistato, viene acquistato (e quindi puoi provare il ripristino). Dovresti fare la maggior parte del tuo sviluppo con le cose del negozio rimosse, e poi quando arrivi a testarlo per davvero, aspettati di creare diversi account di prova.


3
D'accordo con Samvermette, è assurdo che il test funzioni così a stretto contatto con un vero negozio. Ci deve essere almeno un modo per cancellare gli acquisti nella sandbox. Per effettuare più acquisti per lo stesso utente ai fini del test ho aggiunto anche un tipo Consumabile.
appsmatics

4
@samvermette L'unica differenza è che SKPaymentTransactionStateRestoredtorni dall'App Store, invece che SKPaymentTransactionStatePurchased. Dal momento che non stai usando soldi veri qui, a tutti gli effetti, SKPaymentTransactionStateRestoredè equivalente al 100% per SKPaymentTransactionStatePurchasedquanto riguarda i test. Spetta a te reimpostare lo stato della tua app su "non acquistato" (elimina la voce pertinente del portachiavi o qualsiasi altra cosa tu stia utilizzando per memorizzare nella cache quella "X acquistata dall'utente")
bobobobo

10

Ho 2 articoli di acquisto in app. 1 per la produzione. e l'altro per il test. quando ho bisogno di "cancellare" elimino l'elemento in app e ne creo uno nuovo (15 secondi in itunes si connettono e 1 secondo per cambiare l'ID del prodotto nel codice)

se non ho bisogno di testare "nuovo utente", utilizzo l'elemento di produzione in app.


Sì, fare una nuova copia del prodotto e cambiare il nome del prodotto nel codice (presumibilmente dopo averlo #definito) sembra di gran lunga la soluzione più semplice per test realistici.
JulianSymes

7

Beh, tecnicamente non ne hai bisogno.

Se ottieni SKPaymentTransactionStateRestored, equivale al 100% all'app store che verifica l'utente e gli concede l'acquisto. Ho un interruttore come:

- (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 questione di avere la logica della tua app / riprendere l'acquisto è semplice: se stai memorizzando gli acquisti nella cache nel portachiavi, elimina il portachiavi. Se lo fai in un altro modo, cambia lo stato dell'app locale per fingere che l'utente non l'abbia mai acquistata prima. La finestra di dialogo per la richiesta di acquisto è sempre la stessa, l'unica differenza è quando si preme SI, ti dà SKPaymentTransactionStateRestoredinvece di SKPaymentTransactionStatePurchased.


5

L'eliminazione della tua app e la reinstallazione funzionano anche per i test sandbox. Dipende dall'app ovviamente, ma sto testando un'app basata su abbonamento che al momento acquista solo durante la registrazione, quindi è stata la soluzione più semplice.


3

Dai un'occhiata a SimStoreKit . È una "versione simulata dello StoreKit dell'iPhone, per testare le interfacce utente del negozio sul simulatore iPhone o anche sul dispositivo senza dover configurare IAP in Connect".

SimStoreKit memorizza gli acquisti nelle impostazioni predefinite dell'utente sotto la chiave ILSimSKTransactions. Quindi per cancellare tutti gli acquisti puoi fare:

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

Sul simulatore, puoi semplicemente rimuovere la tua app e installarla di nuovo.

Ho utilizzato con successo SimStoreKit per eseguire il debug della parte anteriore del negozio della mia app prima di eseguire il test con la sandbox. La bellezza di questa libreria è che può essere configurata per utilizzare gli stessi nomi di classi del vero framework StoreKit (da fare #define ILSimReplaceRealStoreKit 1prima di fare #include <ILSimStoreKit.h>).

Nei file sorgente in cui devo accedere a StoreKit, includo questo file di intestazione:

#import <TargetConditionals.h>

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

Questo ha l'effetto di utilizzare SimStoreKit quando corro sul simulatore e il vero StoreKit quando corro sul dispositivo.


non riuscivo a farlo funzionare. Ricevo un errore di build. Ho copiato tutti i file nello zip nel mio progetto e ho sostituito tutto #import <StoreKit / StoreKit.h> con #define ILSimReplaceRealStoreKit 1 #import "ILSimStoreKit.h"
Jay Q.

Hai solo bisogno dei file che iniziano con ILSimSK. L'altra roba è per l'app demo. Forse dovresti pubblicare una domanda con l'errore esatto che stai ricevendo. "Sto ricevendo un errore di compilazione" non dice molto.
Emile Cormier

-1

in alternativa, per creare più soluzioni utente di prova è possibile creare più test negli acquisti di app in iTunes Connect, quindi non è necessario modificare un account utente.


1
I motivi per i voti negativi sono: 1. Non è una buona soluzione in quanto potresti provare a testare una soluzione di acquisto in-app specifica che potrebbe richiedere molti scenari con accesso utente dell'applicazione e disponibilità di contenuti su più dispositivi / piattaforme. 2. È tanto (anzi più) noioso creare più acquisti di prova quanto creare più account di prova. 3. Inoltre, la risposta non è molto ben formattata.
mickeymoon

-1

Continua a utilizzare lo stesso account di prova, ripristinando gli acquisti anziché completarne di nuovi. Dopotutto, sia che inizi un nuovo acquisto o ne ripristini uno vecchio, la TUA APP farà la stessa cosa (almeno inizialmente, forse l'interfaccia utente si aggiornerà in modo diverso al termine). Apple sono le persone che gestiscono le cose in modo diverso in quelle diverse situazioni, non preoccuparti.

Inserisci la tua logica di consegna nel caso SKPaymentTransactionStateRestored all'interno dell'implementazione di questo metodo per il test:

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

Quindi assicurati di inserire quella logica di consegna nel caso SKPaymentTransactionStatePurchased.

Alla fine, poiché la maggior parte di noi è ossessivo-compulsiva a vari livelli, fai un test finale con un nuovo account (non è un grosso problema crearne un secondo per assoluta certezza).

L'ultima cosa da notare: considera la posizione di Apple. Se ci fosse stato un problema con gli sviluppatori che dovevano perdere tempo a creare decine o centinaia di account per testare a fondo IAP, avrebbero risolto il problema. Non c'è problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.