React-native-iap: buySubscription ignorando los comentarios de los usuarios

Creado en 6 oct. 2018  ·  32Comentarios  ·  Fuente: dooboolab/react-native-iap

Versión de react-native-iap

2.3.0

Plataformas a las que te enfrentaste con el error (¿IOS o Android o ambos?)

Androide

Comportamiento esperado

let sub = await RNIApp.buySubscription ("algunos");

debe esperar a que el usuario presione comprar en el modal de pagos en la aplicación

Comportamiento real

No puedo verificar si el usuario aceptó la suscripción, porque al hacer:

let sub = await RNIApp.buySubscription ("algunos");
si (sub) {
hacer algunas cosas ...
}

el bloque if (sub) se ejecuta inmediatamente después de que se abre la ventana emergente, pero el usuario aún no acepta la suscripción

Entorno probado (¿Emulador? ¿Dispositivo real?)

Dispositivo real

¿Algunas ideas?

Hay otros métodos como getAvailablePurchases que también devuelve una promesa y funciona bien

El problema es que buySubscription debería devolver la devolución de llamada de la entrada del usuario y no es

⌚️ regression 📱 iOS

Comentario más útil

Actualmente estamos trabajando en esto. Además, cualquiera que esté enfrentando esto, ¿llamó a getSubscriptions antes de llamar a buySubscription ?

Todos 32 comentarios

Estoy usando RN 57, también, la suscripción se realiza, puedo verificar en la tienda de juegos que la compra está bien, pero la promesa de compra de suscripción regresa indefinida

¿alguna ayuda?

Bueno, bajé a 2.2.2 y funciona ... así que creo que se perdieron algo en su nueva versión

@ marcosmartinez7 Perdón por la ruptura, ¿podrías probar 2.3.1 ?

¡Hola Gracias!

No tengo tiempo ahora pero lo tendré

@ marcosmartinez7 Gracias por favor vuelve.

@dooboolab Issue también está presente en iOS. Probé tanto 2.3.1 como 2.3.2 . Como lo menciona @ marcosmartinez7 2.2.2 funciona bien

Creo que está arreglado en 2.3.3 . Vuelva a abrir cuando esto todavía esté ocurriendo.

@dooboolab Lo siento, acabo de instalar y volver a vincular 2.3.5 . await RNIap.buySubscription(iapProductId) todavía devuelve inmediatamente undefined en iOS

@ Gaia-Nutrition Creo que su problema es diferente porque el código ios no ha cambiado. ¿Podrías intentar desvincular y vincular de nuevo?

@dooboolab Intenté vincular y desvincular. Siempre que vuelvo a 2.2.2 , comienza a funcionar de nuevo. Pero lo comprobaré de nuevo mañana. Tal vez intente instalar manualmente el componente nativo

@dooboolab Ok, ahora 2.3.6 . Todavía obtengo undefined . Me encantaría ayudar a resolver este problema. ¡Déjame saber qué puedo hacer para ayudarte!

¿Alguien puede confirmar esto? Esto no debería suceder especialmente en iOS.

@dooboolab Puedo confirmar que en iOS la versión 2.3.6 no ejecuta las promesas pero la versión 2.2.2 sí (usando un dispositivo iPhone 5, React Native 0.56)

También estoy experimentando este problema en 2.3.7. Cuando trato de usar await se llama a la siguiente línea de inmediato en lugar de esperar la promesa, y cuando uso RNIap.buySubscription(subId).then(purchase => {}) se bloquea con un error, no se puede leer la propiedad y luego no se define.

Actualmente estamos trabajando en esto. Además, cualquiera que esté enfrentando esto, ¿llamó a getSubscriptions antes de llamar a buySubscription ?

Acabo de probar la compra en la aplicación RNExample. Compré una suscripción con el método buyProductWithoutFinishTransaction ().
Sugiero probar como RNExample. Y actualice Xcode, configuración de compilación a 'legacy' ... Supongo que el proceso de compilación en Xcode cambió esta actualización.
Y use un probador de caja de arena recién hecho.

@JJMoon muy interesante. ¡La combinación de buyProductWithoutFinishTransaction() y finishTransaction() funciona en 2.3.7 mientras que buySubscription() directamente todavía falla!

@ Gaia-Nutrition OK. Luego use buyProductWithoutFinishTransaction y finishTransaction lugar de buySubscription . La acción de compra es exactamente la misma.

@ Gaia-Nutrition ¿Puedes probar 2.3.8 ? Además, ¿llamaste getSubscriptions antes de buySubscription ?

@dooboolab 2.3.8 aún falla usando buySubscription y nuevamente: Sí, llamé a getSubscriptions antes. No creo que buyProductWithoutFinishTransaction() funcionaría de otra manera.

Probé buySubscription en un dispositivo iOS en modo sandbox.
Se las arregló con éxito, pero muestra algún mensaje de error.
Y la suscripción renovable automática no emite recibo.
Sugiero usar buyProductWithoutFinishTransaction y finishTransaction en lugar de buySubscription.
Actualmente no tengo ningún dispositivo para probar, seguiré este problema más adelante.

Parece que esto es solo un problema en iOS actualmente. Estoy en lo cierto?

@dooboolab No, también ocurre en Android. La función devuelve undefined incluso antes de que se llame a la primera línea de buyItemByType.

@dooboolab El problema se debe a index.js: 105. Deberías cambiar las líneas a algo como

export const buySubscription = (sku, oldSku, prorationMode) => Platform.select({ ios: () => RNIapIos.buyProduct(sku), android: () => RNIapModule.buyItemByType(ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, -1), })();
(Sé que esto ignora el modo prorrateo)

Sin embargo, después de suscribirse exitosamente, hay un problema:

E/UncaughtException: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference at com.dooboolab.RNIap.RNIapModule$11.onPurchasesUpdated(RNIapModule.java:427) at com.android.billingclient.api.BillingClientImpl$1.onReceive(BillingClientImpl.java:136) at com.android.billingclient.api.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:303) at com.android.billingclient.api.LocalBroadcastManager.access$000(LocalBroadcastManager.java:44) at com.android.billingclient.api.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:114) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6938) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

@mfentross ¿ react-native-iap estás? Hay una línea vacía en RNIapModule.java:427 . Vuelva a intentarlo para el más reciente.

Culpa mía: edité algunas líneas. Pero la solución para el problema principal es editar la función buySubscription para

'
export const buySubscription = (sku, oldSku, prorationMode) =>
Platform.select ({
ios: () => RNIapIos.buyProduct (sku),
android: () => {
if (! prorationMode) prorationMode = -1;
return RNIapModule.buyItemByType (ANDROID_ITEM_TYPE_SUBSCRIPTION, sku, oldSku, prorationMode);
},
}) ();

'

Hubo algunos corchetes innecesarios.

@mfentross mi mal. Me perdí la declaración return . Acabo de publicar en 2.3.11 . Entonces, ¿ahora el Android está funcionando?

@dooboolab Gracias, ahora funciona 👍

@mfentross @JJMoon ¡Ok! Así que solo nos queda el problema de iOS.

@JJMoon Dice que si envuelve el método con async y await , funciona. Sin embargo, no estoy muy seguro de cómo esto podría ser posible. Envolver con async y await es redundante en valor de retorno, ¿no es así?

He publicado en 2.3.13 . Espero que todos prueben esto.

Vuelva a abrir cuando esto todavía esté ocurriendo. Gracias por todas las ayudas.

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