2017-11-09 8 views
0

In meiner App möchte ich nicht erneuernde Abonnements implementieren. Ich habe (ich glaube richtig) meine Logik aufgebaut. Ich stelle den Beobachter in der AppDelegate und dann in der Klasse, die SKPaymentTransactionObserver implementiert ich die folgende Funktion implementieren:Wiederherstellen unverarbeitete SKPaymentTransaction für nicht erneuernde Abonnement

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { } 

Innerhalb dieser Methode, die ich Schleife durch die alle updatedTransactions und ich prüfe jedes transactionState und dementsprechend ich meine Logik implementieren .

Was ich stört, ist dies: wenn die Transaktion erfolgreich ist, ich habe unseren Server kontaktieren Profil des Benutzers zu aktualisieren und mehr Tage, um sein/ihr Abonnement hinzuzufügen. Dies bedeutet, dass ich SKPaymentQueue.default().finishTransaction(transaction)nach anrufen muss Ich habe eine erfolgreiche Antwort von unseren Servern erhalten. Es besteht jedoch die Möglichkeit, dass etwas schief geht, sobald die Server von Apple die Transaktion abgeschlossen haben, bis unsere Server reagieren.

würde eine Verknüpfung, um die Transaktion zu markieren, wie sobald Apple-antwortet fertig, aber durch die Dokumentation zu lesen, ist es nicht korrekt zu sein scheint. Wie kann ich eine nicht verarbeitete Transaktion wiederherstellen? (falls unsere Server nicht antworten und die SKPaymentQueue.default().finishTransaction(transaction) nicht angerufen wird).

Vielen Dank im Voraus.

Antwort

3

sollten Sie die Transaktion markieren, wie erst nach Ihrem Server erkennt es fertig.

Wenn zwischen dem erfolgreichen Abschluss der Transaktion und dem Ausfall des Servers ein Fehler auftritt, bleibt die Transaktion unvollständig und kann unter SKPaymentQueue.default.transactions direkt nach dem Hinzufügen des Beobachters aufgerufen werden die Warteschlange.

Sie können dann diese Transaktionen oder den Empfang nehmen und es zu Ihrem Server für einen weiteren Versuch senden an die Dauer ihres Abonnements zu erhöhen.

Zusätzlich from Apple's docs:

Betrachten wir zum Beispiel den Fall eines Benutzers etwas in Ihrer App rechts, bevor er in einen Tunnel zu kaufen. Ihre App kann den gekauften Inhalt nicht liefern, da keine Netzwerkverbindung besteht. Wenn Ihre App das nächste Mal gestartet wird, ruft StoreKit erneut die Transaktionswarteschlange auf und liefert die gekauften Inhalte zu diesem Zeitpunkt. Und falls Ihre Anwendung eine Transaktion markieren nicht als abgeschlossen, ruft StoreKit die Beobachter jedes Mal die App gestartet wird, bis die Transaktion ordnungsgemäß beendet.

+0

Dank. Ich neu, dass die Logik geändert werden musste und Ihre Antwort es verifiziert hat. Was ich getan habe, war, die Kaufdetails als Schlüssel der Transaktions-ID beizubehalten, sobald ich eine Antwort von den Servern von Apple erhalte. Wenn etwas schief geht, prüft das nächste Mal, wenn der Beobachter aufgerufen wird, ob ein gespeicherter Kauf mit dieser Transaktions-ID als Schlüssel vorliegt. Wenn ja, dann mache ich den Anruf bei unseren Servern mit den gespeicherten Details und wenn ich eine erfolgreiche Antwort erhalte, rufe ich die Transaktion an und entferne die persistenten Kaufdetails. – TheoK

Verwandte Themen