React-native-iap: PurchaseUpdateListner werden beim iOS-Produktionsbuild nicht aufgerufen called

Erstellt am 9. Okt. 2020  ·  25Kommentare  ·  Quelle: dooboolab/react-native-iap

Hallo zusammen,

Ich bin mir nicht sicher, was wirklich mit meinem Code passiert. Ich habe das reaktive-native-iap-Plugin in meine iOS-Anwendung integriert. Und es funktionierte gut bei lokalem Build oder Testflight-Build, aber als ich die mobile Version der Anwendung veröffentlicht habe und das Abonnement abgeschlossen habe, passierte als nächstes nichts. Ich nahm an, dass PurchaseUpdateListeners nicht im Produktions-Build funktionieren, dann habe ich die Listener entfernt und den Code geschrieben, direkt nachdem die requestSubscription die Antwort gesendet hat. Und veröffentlichte die nächste Version der Anwendung, aber immer noch das gleiche Problem, auch getReceiptIOS nicht genannt. Ich stecke darin fest. Helfen Sie mir, dies herauszufinden.

Hier ist mein Code: -

const Käufe = erwarten RNIap.requestSubscription(productId);
console.log(Käufe, "Kauf...")
this.validateTransactionReceipt(Käufe);

ValidateTransactionReceipt-Methode: -

valideTransactionReceipt = (Kauf) => {
const Quittung = Kauf.TransaktionReceipt;
wenn (Empfang) {
AppEventsLogger.logEvent("Abonnementtransaktionsbestätigung validiert", { type: 'owner' });
const quittungBody = {
'Belegdaten': Kauf.TransaktionReceipt,
'Passwort': SubscriptionSecret
};

        RNIap.validateReceiptIos(receiptBody, true).then(receipts => {
            let lastReceipt = receipts.latest_receipt_info[receipts.latest_receipt_info.length - 1];
            console.log(lastReceipt, "lastReceipt...")
            let params = {
                productId: purchase.productId,
                transactionId: purchase.transactionId,
                autoRenew: purchase.hasOwnProperty("originalTransactionDateIOS") ? true : false,
                // autoRenew: true,
                transactionDate: purchase.transactionDate,
                status: "success",
                transactionReceipt: lastReceipt,
                paymentMode: receipts.environment,
                originalTransactionDateIOS: purchase.hasOwnProperty("originalTransactionDateIOS") ? purchase.originalTransactionDateIOS : purchase.transactionDate,
                originalTransactionIdentifierIOS: purchase.hasOwnProperty("originalTransactionIdentifierIOS") ? purchase.originalTransactionIdentifierIOS : purchase.transactionId
            }

            console.log(params, "params-1");
            this.subscriptionSaveHandler(params);
        });
        if (Platform.OS === 'ios') {
            RNIap.finishTransactionIOS(purchase.transactionId).then(response => {
                console.log(response, "finish");
            });
        }
    }
}

Vielen Dank

📱 iOS 🙏 help wanted

Alle 25 Kommentare

Ich denke, Sie müssen zuerst validReceiptIos mit einem falschen Parameter aufrufen, und wenn dieser Aufruf dann eine 21007 zurückgibt, rufen Sie ihn mit true auf. Auf diese Weise funktioniert es sowohl in der Prod- als auch in der Sandbox. Das ist etwas, auf das ich gestoßen bin.

Ich habe das gleiche Problem, auch wenn "isTest" beim Aufrufen von RNIap.validateReceiptIos() auf "false" gesetzt ist.

Das Testen auf einem tatsächlichen Gerät mit "isTest" auf "true" scheint zu funktionieren, aber wenn es in die Produktion verschoben wird, funktioniert es nicht.
Irgendwie genehmigen Apples Tester meine App, wobei ich mir nicht sicher bin, wie.

Auf jeden Fall, wenn Sie die Quittungsvalidierung in der Produktion validieren (verwenden Sie false param), wenn diese mit einem Status von 21007 zurückgegeben wird, in der Sandbox validieren (verwenden Sie true param).

Rufen Sie dann nach dem Aufruf von finishTransactionIOS() auch finishTransaction() auf.

Ich hoffe, das hilft!

@the-dut super! Werde diese Konfiguration mal ausprobieren.

Werde berichten was passiert :D.

Ich wünschte nur, Apple und Google hätten solidere Fähigkeiten, die Entwickler testen können, bevor sie den Prozess der Release-Flows durchlaufen, nur um herauszufinden, dass unser Code nicht funktioniert :/.

@the-dut ok, jetzt bekomme ich endlose Passwort- / Anmeldeaufforderungen, nachdem ich RNIap.requestSubscription([productId]) aufgerufen habe.

Es könnten alle vorherigen Anfragen sein, die nie abgeschlossen wurden. Könnte Hunderte oder Tausende sein, je nachdem, wie viel Sie getestet haben. Vielleicht geht es dir gut, wenn du sie durchgestanden hast.

Testen Sie auch auf einem echten Gerät? Lokal oder Testflug? Verwenden Sie einen Sandbox-Benutzer oder eine Produktions-ID? Und wenn Sandbox-Benutzer, haben Sie diese ID in Ihrem Telefon als Sandbox-Benutzer eingerichtet?

Ich habe das Problem nie gesehen. Aber ich kann versuchen zu helfen.

Testen Sie auch auf einem echten Gerät?
Echtes Gerät über XCode :: iOS 13.6.1

Lokal oder Testflug?
Lokal

Verwenden Sie einen Sandbox-Benutzer oder eine Produktions-ID?
Sandbox-Benutzer-ID

Und wenn Sandbox-Benutzer, haben Sie diese ID in Ihrem Telefon als Sandbox-Benutzer eingerichtet?
Sie sind eingerichtet

hier ist mein code

buyUpdatedListener():


await RNIap.clearTransactionIOS();
            let receipt = purchase.transactionReceipt;

            validatePurchase(receipt).then(async resp => {
                console.log('validated purchase');
                console.log(resp);
                // let iosTransactionFinished = await finishTransactionIOS(purchase.transactionId);
                let transactionFinished = await finishTransaction(purchase, false);
                let result = await successfullySubscribed(purchase);


                if (result.success && !fullFirstLaunchFlow) {
                    goTo('Home');
                }
            });

validePurchase():

const receiptBody = {
                    'receipt-data': receipt,
                    'password': '<shared secret>'
                };

                console.log('validating purchase');

                let validReceipt = await RNIap.validateReceiptIos(receiptBody, false);
                console.log('valid receipt');
                console.log(validReceipt);
                if(validReceipt.status === 21007){
                    validReceipt = await RNIap.validateReceiptIos(receiptBody, true);
                    console.log('valid receipt was 21007');
                    console.log(validReceipt);
                }

Gibt es einen Grund, warum Sie das finishTransactionIOS auskommentiert haben? Sie sollten beides tun: finishTransactionIOS() und dann finishTransaction()

Ich könnte verwirrt sein, aber ich dachte, diese Beschreibung in der README-Datei sollte nur "finishTransaction" verwenden, wenn v4.1.0 oder höher verwendet wird.

Oder bedeutet es, dass Sie beide verwenden, wie Sie es vorschlagen?

Ich verwende derzeit v4.5.4.

iOS only
Finish a transaction. Use finishTransaction instead for both platforms since version 4.1.0 or later.

Toller Punkt! Ich mache beides nur für den Fall.

Naja, so oder so kommt es noch nie zu diesen Zeilen, lol.

Ich werde diese Zeile auskommentieren. Ich bin bereit, alles zu versuchen, damit das funktioniert :D

Gerade auf v5.0.0 aktualisiert, in der Hoffnung, dass sich etwas geändert hat, aber keine Würfel.

Immer noch mehrere pwd-Eingabeaufforderungen.

Ich erhalte 2 gleichzeitig und nach der zweiten Aufforderung wird die Fehlermeldung "E_UNKNOWN" ausgegeben, die keine Verbindung zu iTunes herstellen kann.

Fängt alles direkt an, wenn Sie Ihren aktualisierten Purchaselistener hinzufügen? Wenn dies der Fall ist, müssen Sie möglicherweise zuerst alle nicht abgeschlossenen Transaktionen durchlaufen. Oder... verwenden Sie Ihre echte Apple-ID anstelle des Testbenutzers.

alles passiert direkt bei "requestSubscription()". Danach sehe ich nie wieder ein Konsolenprotokoll.

Das einzige Konsolenprotokoll, das ich nach der Ausführung von requestSubscription sehe, ist "Purchase Started!".

Das nächste Konsolenprotokoll lautet "Kauf fehlgeschlagen!!" gefolgt von den "E_UNKNOWN"-Fehlern innerhalb von "puchaseErrorListener".

Hast du es mit deiner echten Apple ID versucht?

Das habe ich noch nicht probiert. Muss ich als Tester meine echte Apple ID hinzufügen?

Nein. Sie können es einfach verwenden, denke ich.

Mit meiner Apple-ID fordert es mich nur einmal auf und gibt sofort den Fehler "E_UNKOWN" aus.

habe gerade versucht, mit einem neu erstellten Sandbox-Benutzer zu testen, aber keine Würfel.

2 pwd-Eingabeaufforderungen und Fehler.

Was wirklich seltsam ist und ich weiß, dass es jetzt nicht so sein soll, ist, dass ich "finishTransaction ()" verwende, bevor ich den Empfang validiere, und es hat auf diese Weise funktioniert.

Schnelles Update.

@the-dut Ich habe einen Build mit allem Setup eingereicht, wie Sie es vorgeschlagen haben (für TestFlight) und es hat funktioniert !! Also werfe ich jetzt die Vorsicht in den Wind und habe es zur Produktion eingereicht.

Das sind tolle Nachrichten! Lassen Sie uns wissen, wie es geht!

Danke an alle, die im aktuellen Thread diskutieren und Vorteile teilen ❤️

Sorry für den verspäteten Bericht.

Vergessen hinzuzufügen, dass es in der Produktion funktioniert!

Als nächstes... Akzeptiere Werbeaktionen, damit ich meine App kostenlos an Freunde und Familie weitergeben kann 😁

@BStenfors9119 was war überhaupt das Problem? Können Sie genau sagen, wie Sie das Problem lösen? Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen