Wenn wir einen iOS7-Beleg aktualisieren müssen, verwenden Sie SKReceiptRefreshRequest. Dadurch wird ein Apple-Dialogfeld geöffnet, in dem sich der Benutzer mit seiner Apple ID anmelden kann. Außerdem können sie abbrechen. Wie können wir feststellen, ob der Benutzer auf Abbrechen drückt? (Natürlich kann dies in iOS6 mit catching the cancel event for [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] erfolgen).Ermitteln, ob Benutzer SKReceiptRefreshRequest abgebrochen hat, um sich anzumelden
Das SKReceiptRefreshRequest Objekt hat einen Delegierten mit zwei Methoden: Wenn der Benutzer
- (void)requestDidFinish:(SKRequest *)request;
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error;
In meinem Code der requestDidFinish Delegat-Methode aufgerufen wird tut oder nicht drücken nicht abbrechen.
Der Grund, warum dies für mich wichtig ist, ist, dass ich den Wiederherstellungsvorgang abbrechen möchte, wenn der Benutzer Abbrechen drückt. Wenn nach der Aktualisierungsanforderung einfach kein Beleg vorhanden war, könnte dies relativ einfach sein. Manchmal ist jedoch in der App vor dem SKReceiptRefreshRequest eine Quittung (mit einigen Käufen) vorhanden, die in der App verbleibt, wenn der Benutzer den Anmeldevorgang abbricht.
Ich habe zwei Ideen, wie dies zu tun:
1) Löschen Sie den Eingang aus dem Bündel vor der Auffrischanforderung. Das offensichtliche Problem dabei ist, dass die App Dateien nicht aus dem Bundle entfernen kann (siehe z. B. Delete file from bundle after install). Ich habe es versucht. Nee.
2) Überprüfen Sie die Bytes der Quittung vor der Aktualisierungsanforderung und danach; Wenn sie sich unterscheiden, sollte dies anzeigen, dass der Benutzer nicht auf Abbrechen geklickt hat. Wenn sie sich nicht unterscheiden, bin ich mir nicht sicher, ob anzeigt, dass sie Abbrechen gedrückt haben. Wenn die Quittung Käufe enthält, denke ich, dass sich die Bytes unterscheiden, da ein aufgefrischter Beleg unterschiedliche Transaktions-IDs haben sollte (aber die gleiche "ursprüngliche" Transaktions-ID). Wenn die Quittung keine Einkäufe enthält, bin ich mir nicht sicher.
Aktualisierung, 11/9/15; Ich habe gerade bemerkt, dass die Delegiertenantwort auf den Benutzer, der Abbrechen drückt, sich geändert zu haben scheint. Jetzt wird didFailWithError aufgerufen. Das Problem des Erkennens einer Benutzerlöschung bleibt jedoch bestehen. Wie können wir unterscheiden, ob der Benutzer Abbrechen und einen echten Fehler drückt? Ich habe auf iOS8.4 und iOS9.2 (Beta) getestet. Ich habe diesen Mangel an Unterscheidbarkeit jetzt als einen Fehler an Apple gemeldet (Bug # 23476210).
Aktualisierung, 11/10/15; Dieses Problem wird nicht erscheinen mit iOS 9.0.2! Ich habe das jetzt mit allen drei Systemen mit der gleichen App-Binärdatei im gleichen ungefähren Zeitintervall versucht (innerhalb von 20 Minuten für alle drei Systeme): (A) iOS9.2 (13C5050d): Problem tritt auf (didFailWithError wird aufgerufen) (B) iOS9.0.2, Problem tritt nicht auf (requestDidFinish wird aufgerufen) und (C) iOS8.4.1, Problem tritt auf. Bei allen drei Systemversionen läuft dies auf echter Hardware, nicht auf dem Simulator.
Ich habe gerade Nummer 2) oben getestet. Und wenn vor der Aktualisierung ein nicht leerer Beleg vorhanden ist, der keine Einkäufe enthält, wird nach der Aktualisierung ein ** anderer ** nicht leerer Beleg angezeigt. Oder zumindest in den zwei Versuchen, die ich gemacht habe, war das der Fall. Eine direktere Lösung wäre natürlich gut. Z. B. eine Löschmethode, die aufgerufen wurde, um anzuzeigen, dass der Benutzer Cancel gedrückt hat. Byteweise unterschieden sich 5515 Bytes und 5522 Bytes zwischen den Quittungen in den Tests, die ich gemacht habe. –