React-native-iap: getAvailablePurchases en iOS permite que aparezca un cuadro de diálogo "Iniciar sesión en iTunes Store"

Creado en 1 oct. 2019  ·  21Comentarios  ·  Fuente: dooboolab/react-native-iap

Versión de react-native-iap

3.4.13

Versión de react-native

0,60,5

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

iOS

Comportamiento esperado

getAvailablePurchases no tiene efectos secundarios

Comportamiento real

Al llamar a getAvailablePurchases en iOS, aparece un cuadro de diálogo "Iniciar sesión en iTunes Store".

Esto no sucede en Android.

IMG_0020

Llamo a getAvailablePurchases durante el inicio de la aplicación para restaurar los artículos comprados. De acuerdo con la documentación entendí que esta es la forma común, ¿verdad?

Para restaurar los artículos comprados, llamo getAvailablePurchases según los cambios de AppState . Desafortunadamente, AppState no solo se activa al iniciar la aplicación, sino también p.ex. después de regresar a la aplicación desde un cuadro de diálogo (causado por la aplicación) p.ex. Iniciar sesión en iTunes ... :(

Para el usuario esto es molesto. Especialmente si el usuario no tiene la intención de comprar algo, no querría ingresar sus credenciales para deshacerse de este diálogo.

Entorno probado (¿Emulador? ¿Dispositivo real?)

dispositivo real

Pasos para reproducir el comportamiento

llame a getAvailablePurchases

❓ question 📱 iOS 🙏 help wanted 🚶🏻 stale

Comentario más útil

¿Existe tal vez alguna forma de saber antes de llamar a getAvailablePurchases que aparecerá el mensaje? O en otras palabras, ¿cómo puedo detectar si el usuario está conectado a iTunes o no?

Todos 21 comentarios

Cuando está en desarrollo, esto se muestra para que pueda iniciar sesión con su cuenta de sandbox. No creo que los documentos sean muy claros al respecto.

Creo que para la producción también puede mostrar un mensaje cada vez que se llama a esta función, ¿verdad? La forma en que implementé esto es que llamo a esto cuando el usuario presiona "restaurar compra" y después de llamar a purchaseUpdatedListener. Para saber si el usuario tiene una suscripción en el futuro, la guardo en el backend y la presento a la aplicación.

Hola @voxspox @alexpchin tiene razón. @alexpchin Ya que estamos trabajando en el puente, asumimos que la gente podría saber un poco sobre IAP en nativo. Poner todas las cosas que ya existen en cada plataforma es una gran carga para los mantenedores. Si hay algunos trabajos en el documento que cree que pueden ser útiles, no dude en agregar cualquier cosa y presione PR .

@mifi Nunca he visto una aplicación con un botón "restaurar mis compras". Desde una perspectiva de UX, este botón es una carga y también innecesario, porque la aplicación debería saber lo que he comprado;)

@hyochan Recibo el mensaje también después de distribuir la aplicación a través de TestFlight (¿supongo que este es el modo de producción?)

He visto algunas aplicaciones con esa función. No lo recuerdo bien ahora, pero creo que es necesario (o requerido por Apple) en algunos casos. También en los ejemplos de pautas de la tienda de aplicaciones de Apple tienen este botón:
https://developer.apple.com/app-store/subscriptions/

También pensé que sería una mala experiencia de usuario si el usuario alguna vez tuviera que ingresar su ID de Apple al abrir mi aplicación, creo que sería confuso. (He visto que esto sucede antes si la sesión expira o si sucede algo con SSL MITM, que suele ser el caso de las páginas de destino wifi públicas)

editar: en realidad parece que Apple lo requiere

¿Existe tal vez alguna forma de saber antes de llamar a getAvailablePurchases que aparecerá el mensaje? O en otras palabras, ¿cómo puedo detectar si el usuario está conectado a iTunes o no?

1+ igual

Hola chicos, ¿alguna respuesta sobre esto? según tengo entendido, esta es una funcionalidad de depuración, pero estoy probando con testflight y quiero evitar que esto suceda, ¿es posible salir de alguna manera del modo sandbox?

Mientras tanto, he encontrado una solución para mí. Introduje una nueva variable isRestorePurchasesEnabled que mi aplicación almacena permanentemente.

En eso:

isRestorePurchasesEnabled = false

Al iniciar la aplicación:

if (Android || isRestorePurchasesEnabled) {
  call getAvailablePurchases
  on error.code === 'E_USER_CANCELLED' -> isRestorePurchasesEnabled= false
}

En compra:

isRestorePurchasesEnabled = true
requestSubscription ...

Ajustes:

Button "restore purchases" -> isRestorePurchasesEnabled = true

El usuario nunca volverá a ver el indicador de conexión de iTunes. La restauración solo ocurre después de realizar una compra y, por lo tanto, las credenciales ya se han ingresado + almacenado y no se mostrará el mensaje.
El único caso en el que se mostrará el mensaje, pero solo una vez, es si el usuario cierra la sesión en Configuración / iTunes / Cuenta de Sandbox. No sé si esto está ahí en modo de producción.

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.

Hola,
Estoy realmente confundido acerca de un tema, ¿alguien puede ayudarme?
Quiero construir un controlador que verifique si el usuario aún posee el producto o no.
¿Cómo puedo detectar la cancelación del usuario usando esta biblioteca tanto para Apple como para Google Play Store?
Ni siquiera sé si está relacionado con este método getAvailablePurchase.
Gracias.

  • mismo

Me gustaría averiguar si esto también sucedería en producción, en lugar de solo TestFlight.
Actualmente estamos usando esta función mientras se carga la aplicación, en lugar de presionar un botón.

Apple todavía nos aconseja no llamar a esta función en la aplicación automáticamente o al iniciar

No restaure las compras automáticamente, especialmente cuando se inicia su aplicación. La restauración de las compras solicita las credenciales de la App Store del usuario, lo que interrumpe el flujo de su aplicación.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restaurar% 20Completed% 20Transactions, de% 20your% 20app's% 20completed% 20transactions.

La forma en que lo implementé es enviar el recibo al backend cuando el usuario presiona comprar o restaurar compra. Luego, el backend puede proporcionar a la aplicación el estado de la suscripción en el futuro.

Apple todavía nos aconseja _no_ llamar a esta función en la aplicación automáticamente o al iniciar

No restaure las compras automáticamente, especialmente cuando se inicia su aplicación. La restauración de las compras solicita las credenciales de la App Store del usuario, lo que interrumpe el flujo de su aplicación.

https://developer.apple.com/documentation/storekit/in-app_purchase/restoring_purchased_products# : ~: text = Restaurar% 20Completed% 20Transactions, de% 20your% 20app's% 20completed% 20transactions.

La forma en que lo implementé es enviar el recibo al backend cuando el usuario presiona comprar o restaurar compra. Luego, el backend puede proporcionar a la aplicación el estado de la suscripción en el futuro.

Para una suscripción de renovación automática, ¿cómo se obtiene el recibo más reciente sin cargarlo desde el cliente?

Ejecutando un sondeo periódico en el backend que valida periódicamente cada compra como esta. Luego, tome el último recibo de la validación (que proviene del servidor de google / apple) y guárdelo nuevamente en la base de datos.

Ejecutando un sondeo periódico en el backend que valida periódicamente cada compra como esta. Luego, tome el último recibo de la validación (que proviene del servidor de google / apple) y guárdelo nuevamente en la base de datos.

Hola @mifi ¡ Gracias por la rápida respuesta! He almacenado el latestReceipt en el servidor después de la transacción original. Entonces, cuando se realiza una encuesta con el latestReceipt original, ¿se devuelve un nuevo latestReceipt ?

Sí, la función iap.validate en el backend llamará a las apis de apple / google que devuelven el recibo más reciente. esto se puede ver fácilmente cuando se prueban suscripciones renovables con un intervalo de desarrollo (5 minutos por período de suscripción)

Gracias @mifi ¡ Eso realmente me ha ayudado a comprender! Parecía extraño enviar el "latestReceipt" para recibir el "latestReceipt"

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