React-native-iap: No se puede obtener una variedad de productos / suscripciones

Creado en 19 ago. 2019  ·  31Comentarios  ·  Fuente: dooboolab/react-native-iap

Versión de react-native-iap

3.3.9

Versión de react-native

0.59.9

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

iOS y Android

Comportamiento esperado

Espero poder obtener una variedad de productos y suscripciones creadas en Play Console y Appstore.

Comportamiento real

Las funciones RNIap.getProducts y RNIap.getSubscriptions siempre devuelven matrices vacías.

Entorno probado (¿Emulador? ¿Dispositivo real?)

Simulador de iOS, emulador de Android y dispositivo real de Android

Pasos para reproducir el comportamiento

  1. Agregar productos en Google Play Console y Apple Appstore Connect
  2. Usé el código de la carpeta de ejemplo
  3. Cambié los ID de productos / suscripciones

Esperé más de 24 horas. También creé la versión interna y alfa en Google Play Console, pero todavía obtengo solo matrices vacías.

Supongo que no tengo claro cuándo exactamente debo esperar que comience a funcionar. Por ejemplo, cuando la implementación de mi prueba Alpha aún está pendiente de publicación en Google Play Console, ¿eso significa que react-native-iap no funcionará? ¿Tengo que esperar hasta que se publique la aplicación para probarla?

También sé que no podré hacer compras de prueba en el simulador / emulador, pero ¿debería getProducts / getSubscriptions funcionar en emuladores o necesito un dispositivo real para probarlo?

const itemSkus = Platform.select({
    ios: ['product_1'],
    android: ['1', '2']
});

const itemSubs = Platform.select({
    ios: ['subscription_1'],
    android: ['subscription_1', 'subscription_2']
});

let purchaseUpdateSubscription;
let purchaseErrorSubscription;

class App extends Component {
    constructor(props) {
        super(props);

        this.state = {
            productList: [],
            receipt: '',
            availableItemsMessage: ''
        };
    }

    async componentDidMount() {
        SplashScreen.hide();
        try {
            const result = await RNIap.initConnection();
            await RNIap.consumeAllItemsAndroid();
            console.log('result', result);
        } catch (err) {
            console.warn(err.code, err.message);
        }

        purchaseUpdateSubscription = purchaseUpdatedListener(async purchase => {
            console.log('purchaseUpdatedListener', purchase);
            if (purchase.purchaseStateAndroid === 1 && !purchase.isAcknowledgedAndroid) {
                try {
                    const ackResult = await acknowledgePurchaseAndroid(purchase.purchaseToken);
                    console.log('ackResult', ackResult);
                } catch (ackErr) {
                    console.warn('ackErr', ackErr);
                }
            }
            this.setState({ receipt: purchase.transactionReceipt }, () => this.goNext());
        });

        purchaseErrorSubscription = purchaseErrorListener(error => {
            console.log('purchaseErrorListener', error);
            Alert.alert('purchase error', JSON.stringify(error));
        });
    }

    componentWillMount() {
        if (purchaseUpdateSubscription) {
            purchaseUpdateSubscription.remove();
            purchaseUpdateSubscription = null;
        }
        if (purchaseErrorSubscription) {
            purchaseErrorSubscription.remove();
            purchaseErrorSubscription = null;
        }
    }

    goNext = () => {
        Alert.alert('Receipt', this.state.receipt);
    };

    getItems = async () => {
        try {
            const products = await RNIap.getProducts(itemSkus);            
            console.log('Products', products);
            this.setState({ productList: products });
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    getSubscriptions = async () => {
        try {
            const products = await RNIap.getSubscriptions(itemSubs);
            console.log('Products', products);
            this.setState({ productList: products });
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    getAvailablePurchases = async () => {
        try {
            console.info('Get available purchases (non-consumable or unconsumed consumable)');
            const purchases = await RNIap.getAvailablePurchases();
            console.info('Available purchases :: ', purchases);
            if (purchases && purchases.length > 0) {
                this.setState({
                    availableItemsMessage: `Got ${purchases.length} items.`,
                    receipt: purchases[0].transactionReceipt
                });
            }
        } catch (err) {
            console.warn(err.code, err.message);
            Alert.alert(err.message);
        }
    };

    requestPurchase = async sku => {
        try {
            RNIap.requestPurchase(sku);
        } catch (err) {
            console.warn(err.code, err.message);
        }
    };

    requestSubscription = async sku => {
        try {
            RNIap.requestSubscription(sku);
        } catch (err) {
            Alert.alert(err.message);
        }
    };

    render() {
        const { productList, receipt, availableItemsMessage } = this.state;
        const receipt100 = receipt.substring(0, 100);

        return (
            <View style={styles.container}>
                <View style={styles.header}>
                    <Text style={styles.headerTxt}>react-native-iap V3</Text>
                </View>
                <View style={styles.content}>
                    <ScrollView style={{ alignSelf: 'stretch' }}>
                        <View style={{ height: 50 }} />
                        <NativeButton
                            onPress={this.getAvailablePurchases}
                            activeOpacity={0.5}
                            style={styles.btn}
                            textStyle={styles.txt}
                        >
                            Get available purchases
                        </NativeButton>

                        <Text style={{ margin: 5, fontSize: 15, alignSelf: 'center' }}>
                            {availableItemsMessage}
                        </Text>

                        <Text style={{ margin: 5, fontSize: 9, alignSelf: 'center' }}>
                            {receipt100}
                        </Text>

                        <NativeButton
                            onPress={() => this.getItems()}
                            activeOpacity={0.5}
                            style={styles.btn}
                            textStyle={styles.txt}
                        >
                            Get Products ({productList.length})
                        </NativeButton>
                        {productList.map((product, i) => {
                            return (
                                <View
                                    key={i}
                                    style={{
                                        flexDirection: 'column'
                                    }}
                                >
                                    <Text
                                        style={{
                                            marginTop: 20,
                                            fontSize: 12,
                                            color: 'black',
                                            minHeight: 100,
                                            alignSelf: 'center',
                                            paddingHorizontal: 20
                                        }}
                                    >
                                        {JSON.stringify(product)}
                                    </Text>
                                    <NativeButton
                                        // onPress={() => this.requestPurchase(product.productId)}
                                        onPress={() => this.requestSubscription(product.productId)}
                                        // onPress={() => this.buyItem(product.productId)}
                                        // onPress={() => this.buySubscribeItem(product.productId)}
                                        activeOpacity={0.5}
                                        style={styles.btn}
                                        textStyle={styles.txt}
                                    >
                                        Request purchase for above product
                                    </NativeButton>
                                </View>
                            );
                        })}
                    </ScrollView>
                </View>
            </View>
        );
    }
}
📱 iOS 🙏 help wanted 🚶🏻 stale 🤖 android

Comentario más útil

Por supuesto Después de publicado por Google Play Store, confirmaré aquí

ACTUALIZAR

Después de que mi aplicación se publicó en Google Play Store, las compras surgieron y funcionaron. Tarda 3 días en aprobarse. Gracias a @jvandenaardweg

ACTUALIZACIÓN 2

react-native-iap puede funcionar en el emulador de Android, si el emulador tiene soporte para Google Play Store.

Todos 31 comentarios

No necesita real device para probar en ios por getProducts / getSubscription pero no en android . Por android , necesitaría tener un dispositivo real para comprar.

Para Google, revise mi guía para resolver su problema.
En realidad, no tiene que publicar la aplicación en Play Store para probarla, pero debe cargar la aplicación firmada.

También tengo este problema, ya creé un producto en Apple y parece que no puedo acceder a él.

const itemSkus = Platform.select({
  ios: [
    'product1'
  ],
  android: []
});

RNIap.getProducts(itemSkus).then((products) => {
      console.log(products);  //<< returns empty array
}).catch((error) => console.log(error))

¿Se necesita tiempo para que el producto se refleje en su experiencia?

Convenios, Tributario y Bancario están todos activos
"react-native-iap": "^ 3.4.0",
Y la aplicación ya está en estado "Listo para enviar"

@nateblog ¿qué tipo de producto

Además, ¿ha agregado una localización en App Store Connect para su producto / suscripción? Si es así, intente agregar la localización que tiene activa en su dispositivo o simulador. Recuerdo que tuve algunos problemas con eso antes. Mi simulador y la configuración regional del dispositivo están en inglés, por lo que solo agregué la localización en "inglés (EE. UU.)" Para mis suscripciones.

@jvandenaardweg : gracias por la respuesta, sí, ya agregué la localización ya que el estado de la aplicación no se establecerá en "Listo para enviar" si me salto la localización. Configuré la localización en "inglés (EE. UU.)" Ya que el dispositivo que estoy usando usa inglés y sí, el producto está suscrito.

ACTUALIZAR

Ya me aseguro de haber habilitado la aplicación en las capacidades y degradado el paquete a 2.4.0, pero sigue siendo el mismo resultado. . No puedo obtener los productos, solo devuelve una matriz vacía.

También vinculé el paquete manualmente ya que otras publicaciones sugirieron no usar el enlace react-native pero aún así el resultado fue el mismo. Estoy usando tanto un simulador como un dispositivo real.

Lo siento, ahora está resuelto, el problema era el ID del paquete en mi xcode, estoy usando el ID del paquete incorrecto, todo funciona ahora

Tenía uno similar y solo necesitaba hacer el proceso de vinculación de la biblioteca manualmente. (ios)

Tengo el mismo problema, no estoy cargando ningún producto de Itunes Connect y no estoy seguro de por dónde empezar a buscar un problema. La aplicación utiliza una versión antigua de RN: 0.43.4. Probé las versiones 3.3.7 y 2.5.5 de RN-IAP. ¿Debería usar una versión anterior de la biblioteca porque tengo una versión anterior de React-Native?

Parece un problema difícil de solucionar, ya que no hay mensajes de error, simplemente no hay datos.

Lo siento, ahora está resuelto, el problema era el ID del paquete en mi xcode, estoy usando el ID del paquete incorrecto, todo funciona ahora

¡Hola, @nateblog! Me enfrento a un problema similar: obtengo matrices vacías para productos y suscripciones y he creado 2 elementos de suscripción dentro de App Store Connect. ¿Podría explicarnos qué estaba mal con su ID de paquete? No creo que esté enviando los SKU de artículo correctos porque no pude encontrar ninguna referencia sobre cómo están construidos o qué son: ¿son [Bundle Identifier]. [ProductId del artículo de compra] o simplemente [ProductId del artículo de compra]?

Además, me gustaría agregar que tengo identificadores de paquete ligeramente diferentes para mis esquemas de liberación y depuración:

  • Lanzamiento - 'domain.appName';
  • Depurar - 'domain.appName.dev';
    Los elementos de compra en la aplicación que he creado están relacionados con la versión de producción (es decir, el lanzamiento) de la aplicación. ¿Eso significa que no pude acceder a esos elementos desde la versión de desarrollo de la aplicación?

Cualquier consejo será muy apreciado.

Tenía uno similar y solo necesitaba hacer el proceso de vinculación de la biblioteca manualmente. (ios)

¡Salvaste mi día!

He integrado react-native-iap y subí mi apk firmado a la versión beta en Play Store y también agregué un plan de suscripción. Estoy tratando de obtener la lista de suscripción por ID de suscripción en modo de depuración que siempre devuelve una matriz vacía. ¿Puedo probar la suscripción en modo de depuración?

@ShridharCodewave estoy enfrentando el mismo problema. por favor avíseme si puede resolver el problema :(

react-native-iap: 3.3.2

Estoy enfrentando el mismo problema en el emulador de Android. Subí apk a Google Play Store al canal Beta y agregué productos.

image

Primero, conexión init, luego estoy tratando de buscar productos pero no aparece nada en la consola.
No hay resultados aquí
No hay errores aquí

@ismetsezer, toda la facturación en la aplicación para Android no funcionará en el emulador:

No puede usar el emulador para probar la facturación de Google Play; debe instalar su aplicación en un dispositivo para probar Google Play Billing.
https://developer.android.com/google/play/billing/billing_testing

Necesitas un dispositivo real para eso.

En iOS, puede obtener datos de suscripción en el simulador. Pero no puedes comprarlo, para eso también necesitas un dispositivo real.

Para los otros comentarios anteriores: también asegúrese de que versionName y versionCode en android/app/build.gradle sean iguales o superiores al que se cargó en Google Play Console.

También necesita una aplicación revisada activa en una pista que no sea de producción, debido a la nueva política de revisión de Android:

Anteriormente, podía probar una aplicación cargando una versión "borrador" no publicada. Esta funcionalidad ya no es compatible. En su lugar, debe publicar su aplicación en la pista de prueba abierta o cerrada. Para obtener más información, consulte Las aplicaciones en borrador ya no son compatibles.
https://developer.android.com/google/play/billing/billing_testing

"Publicar" en una pista de prueba cerrada / abierta significa que debe pasar por el nuevo proceso de revisión de Google Play. Lo que podría llevar un par de días para las aplicaciones nuevas y solo un par de horas para las aplicaciones existentes.

No sé los pasos exactos que hice, pero para mí está funcionando localmente con un dispositivo Android. Así que probablemente no sea un problema del paquete react-native-iap, sino más bien una cuestión de configuración.

Si alguien puede confirmar lo anterior, tal vez sea bueno actualizar el archivo README sobre este cambio. Como esto es algo nuevo desde el mes pasado.

Gracias @jvandenaardweg cuando

Es bueno escuchar a @ismetsezer . ¿Puede confirmar si comienza a funcionar para usted con una aplicación de prueba revisada / publicada? Porque entonces podemos actualizar el archivo Léame con esa nueva información :-)

Por supuesto Después de publicado por Google Play Store, confirmaré aquí

ACTUALIZAR

Después de que mi aplicación se publicó en Google Play Store, las compras surgieron y funcionaron. Tarda 3 días en aprobarse. Gracias a @jvandenaardweg

ACTUALIZACIÓN 2

react-native-iap puede funcionar en el emulador de Android, si el emulador tiene soporte para Google Play Store.

@kesepara Tuve que esperar unas horas después de agregar el nuevo plan de suscripción en Play Store para que apareciera en el dispositivo.

Hola @ismetsezer y @kesepara ,
Realmente agradecería su opinión sobre su flujo de desarrollo, ya que algo aún no me queda claro.
Configuré RN IAP para iOS y ahora funciona bien.
Ahora estoy empezando a hacer la parte de Android, y lo he encontrado aquí que tenemos que utilizar firmado APK subido en pista cerrada (al menos) para poder características de pago de prueba.
Pero en tus comentarios estás diciendo que has podido probarlo en el emulador de Android, ¿es correcto?
Además, si tenemos que usar APK firmado en la tienda, ¿cómo podemos depurarlo?
Su ayuda será muy apreciada.

Hola @beeremy gracias por tus buenas opiniones. Debe probar iap en un dispositivo real o emulador que tenga soporte de Google Play para buscar productos. IAP funcionó después de que publiqué la aplicación en Google Play Store, esto podría cambiar, pero al menos debe cargar o dar un borrador en la tienda para probar esta función. Pero tarda de 2 a 3 horas en funcionar.

Hola @ismetsezer , gracias por tus comentarios.

Para quien pueda ser útil, he podido realizar una configuración de depuración después de seguir esta recomendación: https://stackoverflow.com/questions/36113347/is-it-possible-to-debug-locally-google-plays -in-app-billing-in-android-studio

Puedo confirmar como @ismetsezer que las suscripciones y los productos funcionarán en Android después de que la aplicación se publique en la consola de Google Play. Tratar de obtener suscripciones / productos cuando la aplicación aún no está publicada no funcionará para Android.

En iOS, las suscripciones y los productos funcionan sin tener la aplicación publicada.

Hola, parece que no ha habido actividad sobre este tema recientemente. ¿Se ha solucionado el problema o aún requiere la atención de la comunidad? Este problema puede cerrarse si no se produce más actividad. También puede etiquetar este problema como "Para discusión" o "Buen primer número" y lo dejaré abierto. Gracias por sus aportaciones.

RN 0.59.1 en Android dev aquí y estoy usando la versión 4.4.1 de iap

Mi construcción se encuentra actualmente en la pista Alpha. Luego , reconstruí como de costumbre en mi máquina en modo de depuración, dentro de Platform.select ({}) Especifiqué el ID de suscripción tal como está en Play Console, y llamé a getSubscriptions () pero recibo una matriz vacía. ¿Es esto porque está en Alpha? ¿Algunas ideas?

@edgaralienfoe, ¿

@acostalima debe estar activado. Asumí que tal vez tardaría unos días en hacerlo, pero aún así no tuve suerte.

@edgaralienfoe Lo pregunto porque recuerdo que hay una opción para activar explícitamente una suscripción en Google Play Console y, si no está activa, la suscripción no aparecerá en su aplicación. Pero, si lo dice, podría haber algún otro problema.

@edgaralienfoe ¿Encontraste la solución? Tal vez la versión de su aplicación deba ser superior a la de la pista Alfa

@edgaralienfoe ¿Encontraste la solución? Tal vez la versión de su aplicación deba ser superior a la de la pista Alfa

La pista alfa funciona bien. He estado probando IAP durante bastante tiempo con compilaciones implementadas en Alpha sin problemas. La pista interna, por otro lado, no funciona.

Para todos los que puedan tener problemas aquí, ¿cuál fue el truco en iOS para mí fue vincular el proyecto manualmente como lo sugirió @ Kuhne1 ?

Hola, parece que no ha habido actividad sobre este tema recientemente. ¿Se ha solucionado el problema o aún requiere la atención de la comunidad? Este problema puede cerrarse si no se produce más actividad. También puede etiquetar este problema como "Para discusión" o "Buen primer número" y lo dejaré abierto. Gracias por sus aportaciones.

Cerrando este problema después de un período prolongado de inactividad. Si este problema todavía está presente en la última versión, no dude en crear un nuevo problema con información actualizada.

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

Temas relacionados

MacMillan13 picture MacMillan13  ·  3Comentarios

chetstone picture chetstone  ·  4Comentarios

ramondelmondo picture ramondelmondo  ·  4Comentarios

coldfins picture coldfins  ·  3Comentarios

Symyon picture Symyon  ·  5Comentarios