React-native-iap: [Android] buyUpdatedListener wird nur einmal ausgelöst, nicht bei jeder Abonnementtransaktion

Erstellt am 21. Sept. 2020  ·  27Kommentare  ·  Quelle: dooboolab/react-native-iap

Version von reaktiv-native-iap

"react-native-iap": "4.5.4",

Version von Reactive-native

"react-native": "0.61.4",

Plattformen, bei denen der Fehler aufgetreten ist (IOS oder Android oder beides?)

Android, nicht auf iOS getestet

Erwartetes Verhalten

buyUpdatedListener wird bei jedem Kauf ausgelöst

Tatsächliches Verhalten

buyUpdatedListener feuert nur einmal für das erste Rezept, dann passiert nichts

Getestete Umgebung (Emulator? Echtes Gerät?)

Echtes Gerät, in dev env mit Test-Google-Konto ausführen (Abonnement alle 5 Minuten wiederholen - E-Mail geht ein, aber kein Empfang).

Vereinfachter Code, den ich verwende:

import React from 'react';
import { Text, View, TouchableOpacity, Alert } from 'react-native';
import RNIap, {
  purchaseUpdatedListener,
  purchaseErrorListener,
} from 'react-native-iap';

import { SpinnerOverlay } from '../components/SpinnerOverlay';

import { itemSkus } from '../config/in-app';
import { validateRecipt } from '../utils/validateRecipt';
import { logger } from '../utils/logger';

export class SubscriptionScreenInner extends React.Component {
  purchaseUpdateSubscription = null;
  purchaseErrorSubscription = null;

  constructor(props) {
    super(props);
    this.state = {
      products: [],
      productsLoaded: false,
      isProcessing: false
    };
  }

  componentDidMount = async () => {
    try {
      if (itemSkus) {
        await RNIap.initConnection();
        await RNIap.flushFailedPurchasesCachedAsPendingAndroid();
        const products = await RNIap.getSubscriptions(itemSkus);
        this.setState({ products, productsLoaded: true });

        this.purchaseUpdateSubscription = purchaseUpdatedListener(
          async (purchase) => {
            try {
              const receipt = purchase.transactionReceipt;
              if (receipt) {
                const validate = await validateRecipt(purchase);

                if (validate) {
                  await RNIap.finishTransaction(purchase, false);
                  this.props.fetchUserProfile();
                  this.resetScreenState();
                  Alert.alert('receipt validated', 'cool');
                }
              }
            } catch (error) {
              this.resetScreenState();
              logger('Validate recipt error', error);
            }
          }
        );

        this.purchaseErrorSubscription = purchaseErrorListener((error) => {
          this.resetScreenState();
          logger('Purchase error during loading', error);
        });
      }
    } catch (error) {
      logger('Store prroducts error', error);
    }
  };

  componentWillUnmount() {
    if (this.purchaseUpdateSubscription) {
      this.purchaseUpdateSubscription.remove();
    }

    if (this.purchaseErrorSubscription) {
      this.purchaseErrorSubscription.remove();
    }

    RNIap.endConnection();
  }

  requestSubscription = async (sku) => {
    this.setState({ isProcessing: true }, async () => {
      await RNIap.requestSubscription(sku);
    });
  };

  resetScreenState = () => {
    this.setState({ isProcessing: false });
  };

  render() {
    const { products, productsLoaded, isProcessing } = this.state;

    if (!productsLoaded || isProcessing) {
      return (
        <View>
          <SpinnerOverlay />
        </View>
      );
    }

    return (
      <View>
        <View>
          <View>
            <View>
              <Text>Buy monthly subscription</Text>
            </View>

            <View>
              <TouchableOpacity onPress={() => this.requestSubscription(products[0].productId)}>
                <Text>Buy</Text>
              </TouchableOpacity>
            </View>
          </View>
        </View>
      </View>
    );
  }
}
🙏 help wanted 🤖 android 🧪 test

Hilfreichster Kommentar

Ach, ich verstehe. Sie haben ein Problem mit dem nächsten Abonnementereignis. Lass mich das testen und komme wieder.

Alle 27 Kommentare

Ich habe React Native auf 0.63.2 aktualisiert, aber es hat nicht geholfen.

Nach dem Bumpen von Reactive-native-iap auf 4.6.3 keine Änderung.

Ich habe genau das gleiche Problem, war früher auf 4.4.9, wurde auf 4.6.3 gestoßen und tritt immer noch auf
Konntest du es beheben oder hast du einen Workaround gefunden?

Dafür habe ich leider keine Lösung.

Das ist sehr seltsam. Wollen Sie damit sagen, dass Sie versuchen, nach dem ersten Kauf erneut zu kaufen, das purchaseUpdatedListener wird nicht ausgelöst? Ich habe dies früher getestet und es sollte so lange feuern, bis Sie den Hörer töten.

Ach, ich verstehe. Sie haben ein Problem mit dem nächsten Abonnementereignis. Lass mich das testen und komme wieder.

Wir stehen vor dem gleichen Problem, ich habe 4.4.9 verwendet und versucht, ein Downgrade und ein Upgrade auf die neueste 5.1.1 durchzuführen, aber das Ergebnis ist immer noch das gleiche. Nur das erste Mal Ereignis erhalten.

irgendeine Lösung dafür?

Als vorübergehende Lösung speichere ich den ersten Beleg vom Abonnementereignis und validiere ihn bei jeder Anwendungsinitialisierung - es funktioniert, aber ich habe es nur für Android getestet.

Hallo @hyochan
Hast du eine Idee, wann das gelöst wird?

Danke

Danke für die Erinnerung! Das teste ich morgen mal.

@hyochan
Ich weiß, dass Sie noch an dem Problem arbeiten, wollte nur über das nächste Patch-Datum für dieses Problem Bescheid wissen, da unser gesamtes Team auf dieses wartet.
Dankeschön

@Kalesberg Ich werde diese Woche auf jeden Fall ausprobieren und Updates teilen. Diese Bibliothek wird jedoch von vielen anderen verwendet und die Implementierung auf purchaseUpdatedListner seitdem nicht geändert. Vielleicht muss ich zuerst ein reproduzierbares Beispiel machen. Ich werde es diese Woche versuchen.

Ähnliche für iOS in #1160

@hyochan
Bin dankbar!!

@Kalesberg Könnten Sie bitte überprüfen, ob android.test.purchased auch mehrmals ausgelöst wird ?

@hyochan wird das tun!

@hyochan
Unser Produkt ist nur für Abonnements gedacht, daher kann android.test.purchased nicht am besten bezeugt werden.
Also habe ich versucht, Ihre Demo-App in dieser Bibliothek zu verwenden und test.sub1 hinzugefügt, aber ich konnte kein Produkt damit erhalten
Screenshot 2020-11-04 at 6 53 06 PM

@Kalesberg Könnten Sie Android Logcat dort platzieren, wo es purchaseUpdatedListener auslöst?

Bitte sagen Sie mir, was in billingResult und purchases .

@hyochan , hoffe es hilft
Ich freue mich sehr auf diese Patch-Version

Ich versuche das jetzt zu untersuchen. Kannst du mir übrigens ein besseres Dateiformat geben? rtf Datei ist schwer zu öffnen in meiner Umgebung, die chromeos . Sie können mir auch eine E-Mail ([email protected]) senden, wenn Sie der Meinung sind, dass es ein Datenschutzproblem gibt.

@hyochan
Bedeutet das, dass an diesem Plugin nichts auszusetzen ist?

die iOS-Version funktioniert gut, aber nur die Android-Handys sind problematisch

Wir finden gerade das Problem heraus. Nach dem von Ihnen bereitgestellten Logcat sieht es jedoch so aus, als ob das acknowledgePurchase das finishTransaction nicht richtig funktionierte, da der Kauf auf Sendung war. Ich habe den Stackoverflow geteilt, der auch über die ähnliche Situation spricht.

@hyochan
das Problem besteht auch im Test-Abonnementmodus, der immer erfolgreich sein sollte

@hyochan , irgendwelche Updates zum Plugin?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen