React-native-iap: [Android] purchaseUpdatedListener se activa solo una vez, no en cada transacción de suscripción

Creado en 21 sept. 2020  ·  27Comentarios  ·  Fuente: dooboolab/react-native-iap

Versión de react-native-iap

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

Versión de react-native

"react-native": "0.61.4",

Plataformas en las que enfrentó el error (¿IOS o Android o ambos?)

Android, no probado en iOS

Comportamiento esperado

purchaseUpdatedListener se activa cada vez que se recibe una compra

Comportamiento real

purchaseUpdatedListener dispara solo una vez para la primera recepción, luego no pasa nada

Entorno probado (¿Emulador? ¿Dispositivo real?)

Dispositivo real, ejecutar en dev env con una cuenta de prueba de Google (la suscripción se repite cada 5 minutos; el correo electrónico es entrante pero el recibo no).

Código simplificado que estoy usando:

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

Comentario más útil

Oh ya veo. Tiene un problema con el próximo evento de suscripción. Déjame probar esto y volver.

Todos 27 comentarios

Actualicé React Native a 0.63.2 pero no ayudó.

Después de pasar react-native-iap a 4.6.3 sin cambios.

Tengo exactamente el mismo problema, solía estar en 4.4.9, subí a 4.6.3 y todavía ocurre
¿Pudiste arreglarlo o encontraste una solución?

Desafortunadamente, no tengo una solución para esto.

Esto es muy extraño. ¿Está diciendo que intenta volver a comprar después de la primera compra, el purchaseUpdatedListener no se activa? He probado esto antes y debería seguir disparando hasta que mates al oyente.

Oh ya veo. Tiene un problema con el próximo evento de suscripción. Déjame probar esto y volver.

Nos enfrentamos al mismo problema, estaba usando 4.4.9 e intenté degradar y actualizar a la última versión 5.1.1, pero el resultado sigue siendo el mismo. Solo obteniendo evento la primera vez.

alguna solución a esto?

Como solución temporal, guardo el primer recibo del evento de suscripción y lo valido en cada inicialización de la aplicación; funciona, pero lo probé solo para Android.

Hola @hyochan
¿Alguna idea de cuándo se resolverá esto?

Gracias

¡Gracias por el recordatorio! Lo probaré mañana.

@hyochan
Sé que todavía está trabajando en el problema, solo quería saber sobre la próxima fecha de parche para este problema, ya que todo nuestro equipo está esperando este.
Gracias

@Kalesberg Definitivamente probaré esta semana y compartiré actualizaciones. Sin embargo, esta biblioteca es utilizada por muchos otros y la implementación en purchaseUpdatedListner no ha cambiado desde entonces. En primer lugar, podría tener que hacer un ejemplo reproducible. Lo intentaré esta semana.

Relacionado por iOS en # 1160

@hyochan
¡¡Lo aprecio!!

@Kalesberg ¿Podría verificar amablemente que android.test.purchased también se dispara varias veces?

¡@hyochan hará eso!

@hyochan
Nuestro producto es solo para base de suscripción, por lo que android.test.purchased no puede ser mejor atestiguado.
Así que intenté usar su aplicación de demostración en esta biblioteca y agregué test.sub1 pero no pude obtener ningún producto con ella
Screenshot 2020-11-04 at 6 53 06 PM

@Kalesberg ¿Podrías poner el logcat de Android donde activa purchaseUpdatedListener ?

Por favor, dime lo que viene en billingResult y purchases .

@hyochan , espero que ayude
Tengo muchas ganas de que llegue el lanzamiento de este parche.

Estoy tratando de investigar esto ahora. Por cierto, ¿puedes darme un mejor formato de archivo? rtf archivo es difícil de abrir en mi entorno que es chromeos . También puede enviarme un correo electrónico ([email protected]) si cree que tiene un problema de privacidad.

@hyochan
¿Significa esto que este complemento no tiene nada de malo?

la versión de iOS funciona bien, pero solo los teléfonos Android son problemáticos

Solo estamos descubriendo el problema. Sin embargo, siguiendo el logcat que ha proporcionado, me parece que el acknowledgePurchase que es finishTransaction no funcionó correctamente ya que la compra estaba en el aire. Compartí el stackoverflow que también habla de una situación similar.

@hyochan
el problema persiste incluso en el modo de suscripción de prueba, que siempre debería tener éxito

@hyochan , ¿alguna actualización sobre el complemento?

¿Fue útil esta página
0 / 5 - 0 calificaciones