Domanda

Per un'applicazione di base con gli acquisti in-app nonconsumable, qualcuno ha capito le best practice per l'utilizzo di restoreCompletedTransactions di SKPaymentQueue?

Osservazioni

Lo so si consiglia di registrare sempre un osservatore di transazione per ricevere transazioni in sospeso che fanno la loro strada verso l'applicazione, ma questa è una questione diversa. Sembra restoreCompletedTransactions è qualcosa che l'applicazione deve decidere attivamente quando chiamare il polling per tutti gli acquisti che il cliente ha già fatto.

Da quello che posso dire, il metodo è progettato per recuperare gli acquisti che potrebbero essere stati persi. Ad esempio, un cliente potrebbe installare o spostare un'applicazione su un nuovo dispositivo in modo in cui i record locali del app di pagamenti precedenti sono persi o ripristinate.

Preoccupazioni

Quello che non è chiaro per me è come rilevare automaticamente questa condizione (vale a dire come decidere quando eseguire il polling per gli acquisti mancante) in modo affidabile. Io non voglio rovinare tutto e rischiare negare un cliente l'accesso alle funzionalità che hanno già pagato.

Al tempo stesso, non voglio chiamare restoreCompletedTransactions ogni volta l'applicazione lancia giusto per essere sicuri e fondamentalmente tornare transazioni che già conosco circa il 99,9% del tempo. (Tranne che per l'acquisto in-app, la mia app in realtà non richiede alcuna connettività di rete.)

Note

documentazione di Apple chiarisce che i clienti non siano ancora una volta prelevata per qualsiasi acquisto nonconsumable che hanno già fatto. Se cercano di ri-acquisto, una transazione di pagamento è ancora apparentemente inviato al app.

Nel peggiore dei casi, un cliente potrebbe recuperare gli acquisti in questo modo, ma mi piace ancora di evitarli cammina per un sentiero che assomiglia a ri-acquisto di qualcosa che hanno già pagato.

È stato utile?

Soluzione

Aggiornamento (giugno 2019)

Apple documentazione su questo argomento è stato aggiornato nel 2018 ed è abbastanza completo. Molte delle sue raccomandazioni sono coerenti con quello che abbiamo finito capire qui. La più grande di sviluppo dal momento che questo argomento è stato pubblicato nel 2009, è la ricevuta App Store in iOS 7.

Nel caso in cui il collegamento va stantio ad un certo punto in futuro, citerò alcuni di documentazione qui.

  

Ripristino Prodotti acquistati

     

Gli utenti ripristinare le transazioni per mantenere l'accesso ai contenuti che hanno già acquistato. Ad esempio, quando l'aggiornamento a un nuovo telefono, non perdono tutti gli elementi hanno acquistato sul vecchio telefono. Includere qualche meccanismo nella vostra applicazione per permettere all'utente di ripristinare i propri acquisti, come ad esempio un pulsante Ripristina acquisti. Ripristino acquisti richiede le credenziali App Store degli utenti, che interrompe il flusso della vostra applicazione:. A causa di questo, non ripristina automaticamente gli acquisti, soprattutto non ogni volta che la vostra applicazione viene lanciato

     

Nella maggior parte dei casi, tutta la vostra applicazione ha bisogno di fare è aggiornare la sua ricezione e fornire i prodotti nel suo ricevimento. La ricevuta rinfrescato contiene un record di dell'utilizzatore acquisti in questa applicazione, su questo dispositivo o qualsiasi altro dispositivo. Tuttavia, alcune applicazioni hanno bisogno di adottare un approccio alternativo per uno dei seguenti motivi:

     
      
  • Se si utilizza il contenuto di Apple-hosted, ripristinando transazioni completate dà la vostra applicazione oggetti della transazione che utilizza per scaricare il contenuto.
  •   
  • Se è necessario supportare le versioni di iOS prima di iOS 7, in cui la ricevuta applicazione non è disponibile, ripristino completato le operazioni, invece.
  •   
  • Se l'applicazione utilizza abbonamenti non rinnovare, la vostra applicazione è responsabile per il processo di ripristino.
  •   
     

Aggiornamento della ricezione chiede l'App Store per l'ultima copia della ricevuta. Aggiornamento di una ricevuta non crea nuove operazioni. Anche se si dovrebbe evitare di aggiornare più volte di seguito, questa azione avrebbe avuto lo stesso risultato come rinfrescante solo una volta.

     

Ripristino transazioni completate crea una nuova transazione per ogni transazione completata l'utente ha effettuato, in sostanza, la riproduzione di storia per il vostro osservatore coda di transazione. Mentre le transazioni sono in fase di restauro, la vostra applicazione mantiene il proprio stato di tenere traccia di questo che è il ripristino di transazioni completate e come deve gestirli. Ripristino più volte crea più transazioni restaurati per ogni transazione completata.


risposta precedente (2009-2012)

Dopo aver scritto la domanda e pensarci, mi si avvicinò con un paio di soluzioni.

Automatico (non raccomandato)

Una possibilità è quella di registrare in default all'utente se restoreCompletedTransactions è stato chiamato (e completato con successo) ancora in app. In caso contrario, l'applicazione chiama una volta sullo start-up. Dal momento che questo flag potrebbe essere memorizzato nella stessa posizione dei pagamenti nonconsumable, se predefinite dall'utente vengono spazzati via in seguito poi il ripristino metodo otterrebbe di nuovo chiamato quando l'applicazione si avvia.

In questo modo, se un cliente esistente è in qualche modo facendo una nuova installazione di app che ancora ottenere i loro acquisti ripristinate automaticamente. Se sono un nuovo cliente che non ha mai lanciato l'applicazione prima, quindi l'operazione di ripristino non restituisce nulla.

In entrambi i casi, restoreCompletedTransactions viene chiamato una sola volta anziché ad ogni lancio.

Manuale (consigliata)

Un'altra opzione è quella di offrire al cliente un pulsante "Ripristina acquisti" da qualche parte, collegarlo al restoreCompletedTransactions e far loro decidere se e quando potrebbe essere necessaria.

(I commenti che seguono vanno in why ripristinare un manuale è probabilmente meglio che tentare di farlo automaticamente.)

Altri suggerimenti

Non dimenticate che un ID Apple può estendersi su più dispositivi. Così il mantenimento di una bandiera su un unico dispositivo (ad esempio, l'iPhone dell'utente) che ti dice se hai fatto un ripristino non consente di rilevare se il cliente ha effettuato un acquisto su un altro dispositivo (dire che il suo iPad) che ha bisogno da ristrutturare sul iPhone. Quindi avere un metodo manuale di lanciare un ripristino è anche necessario, anche se si dispone di un metodo automatico.

A peggiorare le cose, non ho ancora capito come si sta avvisato quando RIMBORSI di IAP sono fatti. Ho il sospetto che il processo di ripristino semplicemente restituirà un elenco di operazioni non rimborsati. Così a) è necessario eliminare il record del di IAP dell'utente quando fate la vostra ripristino in caso rimborsato prodotti non sono semplicemente segnalato durante il ripristino, e b) è necessario fare periodicamente un ripristino automatico, al fine di raccogliere i rimborsi.

Tutto questo mette in evidenza il problema con l'IAP di Apple - è mal concepita e documentata adeguatamente - e ora è richiesto per i fornitori di contenuti come i lettori di ebook che hanno già negozi web-based perfettamente funzionanti che già lavorano nelle loro applicazioni (come Kindle).

Ogni volta che si dispone di un non-consumabile acquisto in-app, per un esempio di una nuova pista di corsa, è necessario implementare un pulsante 'Ripristina' da qualche parte in app in modo che l'utente può ripristinare il loro acquisto se cambiano i dispositivi o eliminare il app. Questo è obbligatorio e ho avuto di Apple rifiuta un'applicazione prima per non attuare il pulsante Ripristina.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top