2.3.0
Androide
let sub = await RNIApp.buySubscription ("algunos");
debe esperar a que el usuario presione comprar en el modal de pagos en la aplicación
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
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
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.
Comentario más útil
Actualmente estamos trabajando en esto. Además, cualquiera que esté enfrentando esto, ¿llamó a
getSubscriptions
antes de llamar abuySubscription
?