2012-04-03 14 views
15

Voglio dire, dovrebbero essere i miei passi?Quando devo convalidare la ricevuta della transazione di acquisto in-app?

1) Get SKPaymentTransactionStatePurchased

2) elimina da SKPaymentQueue e di fornire il contenuto da [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

3) Convalida la ricevuta e poi, se è valido, bloccare il contenuto che ho appena fornito

O dovrei cambiare il 2 ° passaggio in 3 ° invece?

1) Get SKPaymentTransactionStatePurchased

2) Convalida la ricevuta e poi, se è valido, dont't fornire contenuti

3) elimina da SKPaymentQueue comunque [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

Nel primo caso utente può spegnere Internet subito dopo l'acquisto, quindi non potrò convalidare la ricevuta. Ma nel secondo, potrebbero esserci dei problemi con Internet tra i passaggi 1 e 2, quindi non finirò la transazione e non fornirò il contenuto, sarebbe una brutta esperienza utente.

Quindi in che modo hai scelto la tua app e perché?

My Choice

ho scelto il secondo scenario, dal momento che la scelta del primo rende la mia app facilmente essere incrinata dalla IAP Cracker.

+0

Sono anche interessante nella risposta a questo. Attualmente sto facendo il tuo primo approccio poiché è un'esperienza utente migliore ed è ancora difficile abusare (continuo a provare a convalidare la ricevuta in background) –

+0

Ho anche deciso di sceglierne uno per la mia app –

+0

Determinare se per scaricare il contenuto (scontrino valido) o meno (scontrino non valido) dal codice dell'app? Se è così, l'unica necessità di cambiare 'if (valido)' in 'if (1)'. Vedi la mia risposta. –

risposta

9

Scenario 2. Se Internet esplode, non si arriva a -finishTransaction. Ma è bello, perché puoi riprovare (NSTimer) e alla tua app verrà data la transazione incompleta all'avvio. E questo è esattamente come StoreKit è progettato per funzionare (anche se non è ovvio dalla lettura dei documenti).

StoreKit viene fornito con transazioni, per una buona ragione. L'utente può semplicemente uscire dall'app subito dopo l'acquisto, e devi ancora recuperarlo. Ed è per questo che Apple consiglia di impostare l'osservatore delle transazioni il prima possibile nel ciclo di vita dell'app.

Non terminare mai la transazione prima di fornire il contenuto, dovrai implementare il tuo sistema di transazioni in cima a StoreKit e non vuoi farlo, credimi (l'ho visto fare , è stato un disastro).

Modifica: in tutta onestà, la fine di un utente che spegne Internet dopo l'acquisto e prima che venga convalidata è ridicolmente bassa.Il tizio era su internet un secondo fa, nessuno esce per tagliare internet nel bel mezzo di un acquisto. Ma è possibile che l'utente venga interrotto in quel momento e invia la tua app in background. La tua app può quindi essere uccisa per qualsiasi motivo che iOS ritenga appropriato. E quando le app ricominciano, beh, la tua app non ricorderà di avere un acquisto da cui iniziare, e il kit di vendita non sarà di grande aiuto, dal momento che hai già finito la transazione.

+0

Sì, passo a questo scenario dopo aver visto che la mia app potrebbe essere facilmente decifrata da iAP cracker. E, sì, corso di caffè, aggiungo l'osservatore in didFinishLaunching) Grazie per la risposta! –

1

Prima verificherei. Ci vogliono 2-3 secondi. È possibile utilizzare ReceiptKit https://github.com/maciekish/ReceiptKit per questo scopo.

+1

In che modo ReceiptKit consente di convalidare la ricevuta senza convalida sull'ambiente del server controllato? Sembra piuttosto facile da hackerare, non è vero? –

3

Questo è quello che faccio:

  1. App invia richiesta di contenuto con ricevuta allegata.

  2. Il server convalida la ricevuta con iTunes e, se valido, restituisce il contenuto acquistato come corpo della risposta alla richiesta originale.

In questo modo, anche se il file binario dell'app viene violato/modificato, il contenuto viene scaricato solo su una ricevuta valida.

Problemi correlati