Löschen von Einkäufen aus der iOS-In-App-Kaufsandbox für einen Testbenutzer

115

Hat jemand Ideen zum Zurücksetzen und / oder Löschen der iOS-In-App-Kaufsandbox?

Ich habe eine App, die ich mit der Sandbox teste, und ich möchte neue Einkäufe testen, ohne jedes Mal, wenn ich etwas kaufe, einen neuen Testbenutzer erstellen zu müssen.

Wenn ich dies nicht tue, erhalte ich (natürlich) immer eine Nachricht, dass der In-App-Kaufartikel bereits gekauft wurde, wenn ich auf die Schaltfläche "Kaufen" meiner App klicke.

RandomIOSDeveloper
quelle

Antworten:

74

IMO gibt es drei Dinge, die Sie tun können, um das Testen von Nicht-Verbrauchsmaterialien erträglich zu machen:

  1. Einer E-Mail können mehrere Testkonten zugeordnet sein. Gmail zum Beispiel können Sie ein „plus“ String an die E - Mail hinzufügen Aliase für eine Adresse zu erstellen : so [email protected]und [email protected]beide wirklich nur zu gehen [email protected]. Wahrscheinlich machen andere E-Mail-Hosts dasselbe. Wenn Sie ein Testkonto erstellen, müssen Sie Folgendes eingeben: Vorname, Nachname, E-Mail-Adresse, Passwort, geheime Frage, geheime Antwort, Geburtsdatum und Land des iTunes-Stores. Sie können genau die gleichen Daten (einschließlich Passwort) für [email protected]und eingeben [email protected]und Sie haben zwei Testkonten. Schließlich erhalten Sie in Ihrem [email protected]Posteingang zwei Bestätigungs-E-Mails von Apple, um beide Testkonten zu bestätigen.

  2. Angenommen, Sie haben ein Nicht-Verbrauchsmaterial mit der Produkt-ID @ "Extra_Levels". Anstatt @ "Extra_Levels" in allen Methoden (requestProduct, purchaseProduct, ...) zu schreiben, schreiben Sie einfach PRODUCT_ID1und setzen Sie eine Header-Datei ein #define PRODUCT_ID1 @"Extra_Levels"(ohne Semikolon!), Dann durchsucht der Präprozessor PRODUCT_ID1 und ersetzt @ "Extra_Levels". Wenn Sie dann ein neues Verbrauchsmaterial mit dem Namen @ "Extra_Levels_01" erstellen und die #define ändern, können Sie die Einkäufe für alle Testbenutzer zurücksetzen.

  3. Wie Appsmatics hervorhob, können Sie das korrekte Verhalten Ihres Codes beim Kauf eines nicht verbrauchbaren IAP testen, indem Sie zuerst einen verbrauchbaren IAP verwenden (damit der Testbenutzer so viele Einkäufe wie nötig tätigen kann), um einige Fehler zu beseitigen. Natürlich sollten Sie den Code danach auch mit dem echten nicht verbrauchbaren IAP testen.

Roberto Canogar
quelle
17
Wow, ich wusste nie von dieser supergeheimen Google Mail-Funktion. Wie nützlich!
Bobobobo
4
Ich habe gerade herausgefunden, dass Sie Ihre Testbenutzer-E-Mail nicht wirklich überprüfen müssen. Sie können einfach [email protected] mit dem angegebenen Kennwort eingeben (damit Sie das Kennwort weiterhin im Sandbox-Modus verwenden) und es funktioniert weiterhin. Ich habe gerade letzte Nacht getestet.
Sooon
3
Der PLUS SIGN-Trick für E-Mail-Aliase ist nicht nur eine GMail-Sache. Es ist eine sehr alte Tradition unter E-Mail-Servern, die Jahrzehnte zurückreicht. Es wurde jedoch nie in E-Mail-Spezifikationen aufgenommen. Testen Sie es also mit Ihrem speziellen E-Mail-Server, um sicherzustellen, dass es mit dieser Funktion vertraut ist.
Basil Bourque
2
Ich würde nicht denken, dass es unmöglich ist, In-App-Käufe für Testkonto zu löschen;) Viva Apple :)
Bartłomiej Semańczyk
12
+E-Mail-Adressen können nicht mehr zum Anmelden für Apple IDs verwendet werden.
Pkamb
32

Soweit ich weiß, können Sie das nicht tun. Das Sandbox-Backend funktioniert wie ein echtes Konto - sobald es gekauft wurde, wird es gekauft (und somit können Sie die Wiederherstellung testen). Sie sollten den größten Teil Ihrer Entwicklung mit ausgeblendeten Store-Inhalten durchführen. Wenn Sie dann mit dem Testen beginnen, sollten Sie nur damit rechnen, mehrere Testkonten zu erstellen.

Ben Zotto
quelle
3
Stimmen Sie mit Samvermette überein, das ist verrückt, dass die Tests so eng mit einem echten Geschäft zusammenarbeiten. Es muss mindestens eine Möglichkeit geben, Einkäufe im Sandkasten zu löschen. Um zum Testen mehrere Einkäufe für denselben Benutzer zu tätigen, habe ich auch einen Verbrauchsmaterialtyp hinzugefügt.
Appsmatics
4
@samvermette Der einzige Unterschied besteht darin, dass Sie SKPaymentTransactionStateRestoredstattdessen aus dem App Store zurückkehren SKPaymentTransactionStatePurchased. Da Sie hier nicht in jeder Hinsicht echtes Geld verwenden, SKPaymentTransactionStateRestoredentspricht dies zu 100% den SKPaymentTransactionStatePurchasedTests. Das Zurücksetzen Ihres App-Status auf "nicht gekauft" liegt ganz bei Ihnen (löschen Sie einfach den entsprechenden Schlüsselbund-Eintrag oder was auch immer Sie verwenden, um das "vom Benutzer gekaufte X" zwischenzuspeichern)
Bobobobo
9

Ich habe 2 in App Kaufartikel. 1 für die Produktion. und der andere zum Testen. Wenn ich "löschen" muss, lösche ich das In-App-Element und erstelle ein neues (15 Sekunden in iTunes Connect und 1 Sekunde, um die Produkt-ID im Code zu ändern).

Wenn ich "neuer Benutzer" nicht testen muss, verwende ich die Produktion im App-Element.

user1105951
quelle
Ja, das Erstellen einer neuen Kopie des Produkts und das Ändern des Produktnamens im Code (vermutlich mit #defined) scheint bei weitem die einfachste Lösung für realistische Tests zu sein.
JulianSymes
7

Technisch gesehen brauchen Sie das nicht.

Wenn Sie erhalten SKPaymentTransactionStateRestored, entspricht dies zu 100% dem App Store, der den Benutzer überprüft und ihm den Kauf gewährt. Ich habe einen Schalter wie:

- (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
     }
  }
}

Die Frage, ob Ihre App logisch ist oder den Kauf zurücknimmt, ist einfach: Wenn Sie Einkäufe im Schlüsselbund zwischenspeichern, löschen Sie Ihren Schlüsselbund. Wenn Sie es anders machen, ändern Sie einfach Ihren lokalen App-Status, um so zu tun, als hätte der Benutzer ihn noch nie zuvor gekauft. Der Kaufanforderungsdialog ist immer noch genau derselbe. Der einzige Unterschied besteht darin, dass Sie beim Drücken von JA SKPaymentTransactionStateRestoredstattdessen statt SKPaymentTransactionStatePurchased.

Bobobobo
quelle
5

Das Löschen Ihrer App und die Neuinstallation funktionieren auch für Sandbox-Tests. Hängt natürlich von der App ab, aber ich teste eine abonnementbasierte App, die im Moment nur während der Anmeldung gekauft wird, sodass dies die einfachste Lösung ist.

Christopher Larsen
quelle
3

Schauen Sie sich SimStoreKit an . Es handelt sich um eine "simulierte Version des StoreKit des iPhones zum Testen von Store-Benutzeroberflächen auf dem iPhone Simulator oder sogar auf einem Gerät, ohne dass IAP in Connect eingerichtet werden muss."

SimStoreKit speichert Einkäufe in den Standardeinstellungen des Benutzers unter dem Schlüssel ILSimSKTransactions. So löschen Sie alle Einkäufe:

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

Auf dem Simulator können Sie einfach Ihre App entfernen und erneut installieren.

Ich habe SimStoreKit erfolgreich zum Debuggen der Store-Front meiner App verwendet, bevor ich mit der Sandbox getestet habe. Das Schöne an dieser Bibliothek ist, dass sie so eingerichtet werden kann, dass dieselben Klassennamen wie das echte StoreKit-Framework verwendet werden (indem Sie dies #define ILSimReplaceRealStoreKit 1vorher tun)#include <ILSimStoreKit.h> ).

In Quelldateien, in denen ich auf StoreKit zugreifen muss, füge ich diese Header-Datei hinzu:

#import <TargetConditionals.h>

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

Dies hat den Effekt, dass SimStoreKit verwendet wird, wenn ich auf dem Simulator ausgeführt werde, und das echte StoreKit, wenn ich auf dem Gerät ausgeführt werde.

Emile Cormier
quelle
konnte das nicht zum Laufen bringen. Ich erhalte einen Build-Fehler. Ich habe alle Dateien in der Zip-Datei in mein Projekt kopiert und alle #import <StoreKit / StoreKit.h> durch #define ILSimReplaceRealStoreKit 1 #import "ILSimStoreKit.h" ersetzt
Jay Q.
Sie benötigen nur die Dateien, die mit ILSimSK beginnen. Das andere Zeug ist für die Demo-App. Vielleicht sollten Sie eine Frage mit dem genauen Fehler stellen, den Sie erhalten. "Ich bekomme einen Build-Fehler" sagt nicht viel.
Emile Cormier
0

Nicht wirklich eine Antwort, aber Hilfe beim Erklären.

Dachte, da die Datei heruntergeladen werden musste, könnte sie vielleicht gelöscht werden. Einfache Funktion unten versucht das (Swift 3.0):

func removeReceipt() {
    if let receiptURL = Bundle.main.appStoreReceiptURL {
        print("receipt URL: \(receiptURL)")
        do {
            try FileManager.default.removeItem(at: receiptURL)
            print("Success")
        } catch let error as NSError {
            print("ERROR: \(error.localizedDescription)")
        }
    }
}

Folgende Antwort erhalten:

Empfangs-URL: Datei: /// privat / var / mobil / Container / Daten / Anwendung / 7A2-App-bezogene-Nummer-67 / StoreKit / sandboxReceipt

FEHLER: "sandboxReceipt" konnte nicht entfernt werden, da Sie keine Zugriffsberechtigung haben.

Obwohl der Code anzeigt, dass er die Quittung aus dem App-Bundle zieht, hatte er gedacht, dass die Quittung statisch ist und die Quittung daher möglicherweise immer noch löschbar ist. Ich bin mir sicher, dass es Sicherheitsgründe gibt, warum dies alles so funktioniert. Daher musste die App gelöscht werden, um den Fall, dass keine Quittung auf eine neu heruntergeladene Quittung heruntergeladen wurde, (erneut) zu testen.

anorskdev
quelle
-1

Alternativ können Sie zum Erstellen mehrerer Testbenutzerlösungen mehrere Tests bei App-Käufen in iTunes Connect erstellen, ohne ein Benutzerkonto ändern zu müssen.

Adobels
quelle
1
Gründe für Abstimmungen sind: 1. Es ist keine gute Lösung, da Sie möglicherweise versuchen, eine bestimmte In-App-Kauflösung zu testen, für die möglicherweise viele Szenarien mit Benutzeranmeldung für Anwendungen und geräte- / plattformübergreifender Verfügbarkeit von Inhalten erforderlich sind. 2. Das Erstellen mehrerer Testkäufe ist (tatsächlich) mühsamer als das Erstellen mehrerer Testkonten. 3. Außerdem ist die Antwort nicht sehr gut formatiert.
Mickeymoon
-1

Verwenden Sie einfach weiterhin dasselbe Testkonto und stellen Sie Einkäufe wieder her, anstatt neue abzuschließen. Unabhängig davon, ob Sie einen neuen Kauf tätigen oder einen alten wiederherstellen, wird IHRE APP dasselbe tun (zumindest anfangs wird die Benutzeroberfläche nach Abschluss möglicherweise anders aktualisiert). Apple sind die Leute, die in diesen verschiedenen Situationen unterschiedlich mit Dingen umgehen - machen Sie sich keine Sorgen.

Platzieren Sie Ihre Übermittlungslogik im Fall SKPaymentTransactionStateRestored in der Implementierung dieser Methode zum Testen:

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

Stellen Sie dann sicher, dass Sie diese Übermittlungslogik in den Fall SKPaymentTransactionStatePurchased einfügen.

Am Ende, weil die meisten von uns in unterschiedlichem Maße zwanghaft sind, machen Sie einen abschließenden Test mit einem neuen Konto (keine große Sache, um einen zweiten für absolute Sicherheit zu machen).

Das Letzte, was zu beachten ist: Betrachten Sie die Position des Apfels. Wenn es ein Problem gegeben hätte, bei dem Entwickler Zeit damit verschwenden müssten, Dutzende oder Hunderte von Konten zu erstellen, um IAP gründlich zu testen, hätten sie das Problem gelöst. Es gibt kein Problem.

ArthurVonBabylon
quelle