React-native-iap: buySubscription devuelve E_UNKNOWN a pesar de la compra exitosa

Creado en 13 oct. 2018  ·  30Comentarios  ·  Fuente: dooboolab/react-native-iap

Versión de react-native-iap

2.2.2 (porque cualquier versión más nueva falla en iOS debido a # 279)

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

iOS

Comportamiento esperado

No debe arrojarse ningún error. La compra fue exitosa (en vivo y en producción)

Comportamiento real

E_UNKNOWN error se devuelve de Promise
Nuestro seguimiento de errores de Sentry.io informa esto:

{"framesToPop":1,"code":"E_UNKNOWN","nativeStackIOS":["0   LuCoaching                          0x000000010062f6fc LuCoaching + 1996540","1   LuCoaching                          0x000000010060aa98 LuCoaching + 1845912","2   LuCoaching                          0x00000001007cad98 __cxa_throw + 438380","3   LuCoaching                          0x00000001007cc62c __cxa_throw + 444672","4   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","5   libdispatch.dylib                   0x000000019d025610 <redacted> + 56","6   LuCoaching                          0x00000001007cc46c __cxa_throw + 444224","7   libdispatch.dylib                   0x000000019d0776c8 <redacted> + 24","8   libdispatch.dylib                   0x000000019d078484 <redacted> + 16","9   libdispatch.dylib                   0x000000019d0249ec <redacted> + 1068","10  CoreFoundation                      0x000000019d5ce1bc <redacted> + 12","11  CoreFoundation                      0x000000019d5c9084 <redacted> + 1964","12  CoreFoundation                      0x000000019d5c85b8 CFRunLoopRunSpecific + 436","13  GraphicsServices                    0x000000019f83c584 GSEventRunModal + 100","14  UIKitCore                           0x00000001ca444bc8 UIApplicationMain + 212","15  LuCoaching                          0x000000010044d110 LuCoaching + 20752","16  libdyld.dylib                       0x000000019d088b94 <redacted> + 4"],"userInfo":{"NSLocalizedDescription":"Verbindung mit iTunes Store nicht möglich"},"domain":"SKErrorDomain","line":26,"column":1877,"sourceURL":"/var/containers/Bundle/Application/818C8439-E250-42E8-AD57-EC4FB5FE5547/LuCoaching.app/main.jsbundle"}

Entorno probado (¿Emulador? ¿Dispositivo real?)

Dispositivo real. Clientes vivos. Muy consistentemente falla

Pasos para reproducir el comportamiento

Al probar el procedimiento con usuarios de Sandbox, el error no se puede reproducir.

🐛 bug 📱 iOS

Comentario más útil

: +1: Estamos experimentando este problema. Parece que le está sucediendo a aproximadamente el 10% de nuestros usuarios actualmente. Intentaremos agregar este oyente, pero no creo que, en última instancia, esta sea una gran solución. @hyochan ¿Hay alguna forma de que podamos obtener información más detallada en los casos en los que esto arroja, o es una respuesta estándar de las API de StoreKit? En todos los casos de error, el mensaje parece ser "No se puede conectar a iTunes Store", incluso cuando la compra se realiza correctamente.

Todos 30 comentarios

@ Gaia-Nutrition ¿Verificaría este viejo problema? Podría ser la misma causa.
https://github.com/dooboolab/react-native-iap/issues/201

@JJMoon en # 201 el error fue E_DEVELOPER_ERROR y fue causado por no llenar la lista validProducts usando getSubscriptions() .
Sin embargo, estoy llamando a la función antes de intentar realizar el pago y también obtengo un error diferente.
Pero ahora que lo pienso. Puede suceder que haya bastante retraso entre la llamada getSubscriptions() y buySubscription() provocada por que el usuario reconsidere si desea realizar la compra. ¿Podría ser esto un problema? Mientras tanto, la aplicación podría haber estado en segundo plano.
EDITAR: Pero, nuevamente, la compra se ejecuta con éxito, por lo que el problema debe ser donde se procesa la respuesta de la tienda de aplicaciones

Hola,

El mismo comportamiento de problema con "buyProductWithoutFinishTransaction" o "buyProduct".

Versión 2.2.1

la devolución almacenada es
{ "framesToPop": 1, "code": "E_UNKNOWN", "nativeStackIOS": [...], "userInfo": { "NSLocalizedDescription": "Connexion à l’iTunes Store impossible" }, "domain": "SKErrorDomain", "line": 16, "column": 1599, "sourceURL": "..." }

Actualizamos el módulo porque reproducimos este error en producción con versiones anteriores.

La parte interesante es que la compra de restauración también falla para mis usuarios cuando esto sucede. Solo le sucede a aproximadamente el 1% de nuestros usuarios de iOS.

@fierysolid En el mismo caso, somos alrededor del 5% de las compras en iOS que fallaron. Cuando el cliente intenta comprar de nuevo, aparece una ventana emergente de compra de restauración.

Hola a todos. Espero que esté arreglado en nuestra nueva versión de hoy, que es 2.3.15 . Me he dado cuenta de que usar NSDictionary en iOS no es seguro y puede causar un comportamiento inesperado. He solucionado esto y espero que ahora funcione bien en todos los dispositivos. Por favor, pruebe esto.

Vuelva a abrir cuando aún tenga el problema.

@dooboolab
Sigo teniendo este problema mientras uso buySubscription() con un usuario de prueba de sandbox con iPhone 6S.

{"userInfo":{"NSLocalizedDescription":"Cannot connect to iTunes Store"}}

@danrevah ¿Así que has probado nuestra nueva versión que es 2.3.15 ? @JJMoon ¿Puedes probar esto una vez más?

@dooboolab sí, estoy usando esa versión.

@danrevah Por favor, prueba 2.3.16 .

@dooboolab funcionó una vez, pero mientras lo intentaba de nuevo seguía recibiendo estos errores. (usado v 2.3.17)

@JJMoon ¿Tienes alguna pista sobre esto? él está usando iPhone6S

Reabrí el problema. cc @JJMoon

Si más personas votan a favor de este tema, intentaremos profundizar más en esto.

@danrevah Espero que se refiera a este documento.
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Subscriptions.html#//apple_ref/doc/uid/TP40008267 -CH7-SW6
Para probar la suscripción en el modo de zona de pruebas, debe volver a comprar la suscripción después de un tiempo.
Y es posible que deba cancelarlo para volver a comprar.
Y hay algunas reacciones extrañas del servidor sandbox de Apple, lo que dificulta la prueba.

Si el problema es el caso @JJMoon, podemos cerrar esto nuevamente. Vuelva a abrir si aún necesita ayuda con este. @danrevah

@JJMoon Me he enfrentado al mismo problema. ¿alguna solución? buySubscription arroja una excepción y, sin embargo, se deduce el pago. Necesito tener datos de resultados para almacenarlos y validarlos.
@hyochans

+1 tengo el mismo problema

Intente usar addAdditionalSuccessPurchaseListenerIOS en buySubscription también. Este es el mismo problema que en el número 307.

Intente usar addAdditionalSuccessPurchaseListenerIOS en buySubscription también. Este es el mismo problema que en el número 307.

¿Alguien ya lo está usando en producción?

@hyochan , he intentado hacer eso pero sin éxito.

if (subscription && subscription.success) {
      this.props.subscribe(subscription.result);
    } else {
      if (Platform.OS === 'ios') {
        const sub = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
          this.props.subscribe(purchase); // -> This code is never fired
          sub.remove();
        });
      }
    }

@cbfranca Siga el código real. Ni siquiera estás usando promises . Debería escuchar addAdditionalSuccessPurchaseListenerIOS después del rechazo de la promesa.

Además, no necesita Platform.OS === 'ios' adicionales.

@hyochan
Perdón por mi ignorancia, pero no creo haber entendido correctamente. Seguí las mismas bases del ejemplo, adaptándome a mi escenario. Creé una abstracción que trata esta promesa usando async / await. Este objeto de suscripción es devuelto por mi abstracción.

static purchaseSubscription(newSubscriptionID, currentSubscriptionID) {
    if (Platform.OS === 'ios') {
      const purchaseResult = KinvoBilling.purchaseSubscriptionIOS(newSubscriptionID);
      return purchaseResult;
    }

    const purchaseResult = KinvoBilling.purchaseSubscriptionANDROID(newSubscriptionID, currentSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionANDROID = async (newSubscriptionID, currentSubscriptionID) => {
    const hasCurrentSubscription = currentSubscriptionID !== null;

    if (hasCurrentSubscription) {
      const purchaseResult = KinvoBilling.updateSubscription(newSubscriptionID, currentSubscriptionID);
      return purchaseResult;
    }
    const purchaseResult = KinvoBilling.buySubscription(newSubscriptionID);
    return purchaseResult;
  }

  static purchaseSubscriptionIOS = async (subscriptionID) => {
    await KinvoBilling.getSubscriptions();
    const purchaseResult = await KinvoBilling.buySubscription(subscriptionID);

    return purchaseResult;
}

@cbfranca
''
static purchaseSubscriptionIOS = async (subscriptionID) => {
aguardar KinvoBilling.getSubscriptions ();
tratar {
const purchaseResult = aguardar KinvoBilling.buySubscription (subscriptionID);
} atrapar (err) {
suscripción const = RNIap.addAdditionalSuccessPurchaseListenerIOS (async (compra) => {
// dooboolab => verifica la llamada aquí.
this.setState ({recibo: purchase.transactionReceipt}, () => this.goToNext ());
suscripción.remove ();
}
}
return purchaseResult;
}
`` ``

Verifique el código anterior. Creo que necesitas refactorizar tu código para que se ajuste a su ciclo de vida.

@hyochan No me funciona.

Mi cenario de prueba es:

  • Compre el plan de suscripción mensual - Ok
  • Actualizar al plan de suscripción anual: falla y el oyente no funciona

Otra duda: ¿Tengo que usar finishTransaction () también en las suscripciones?

También veo este error. Y creo que conozco una forma de reproducirlo.

Versión de react-native-iap

^ 2.4.1

Versión de react-native

https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz

Plataforma

iOS, al probar en TestFlight en un dispositivo real.

Observaciones

Noté que cuando se llamaba a cualquier función de RNIap en mi aplicación, iOS me pedía que ingresara una contraseña para un usuario anterior de iTunes / App Store (que desde entonces he cerrado sesión y reemplazado a través de la configuración de iOS). Leí en algún lugar en línea que este es un problema que persigue a los usuarios de iPhone de vez en cuando: a veces se compra una aplicación con una cuenta de iTunes, luego el teléfono se cambia a una nueva cuenta de iTunes, pero la aplicación continúa pidiendo la contraseña para el antigua cuenta de iTunes.

Intenté eliminar mi aplicación (y TestFlight) y reinstalarla con el nuevo usuario de la App Store, sin éxito. La única forma en que podía deshacerme de este comportamiento era borrar el dispositivo. Una vez que hice esto, ya no pude reproducir este error.

Comportamiento real

  1. buySubscription ()
  2. Seleccione Continuar cuando se le presenten los "Términos de suscripción" modal de iOS
  3. Seleccione Aceptar cuando se le presente el modal de iOS "Confirmar suscripción"
  4. Error arrojado por buySubscription ():
{
   code: E_UNKNOWN, 
   column: 1565, 
   domain: NSURLErrorDomain, 
   framesToPop: 1, 
   line: 20, 
   nativeStackIOS: [...],
   sourceURL: ...,
   userInfo: {
      _kCFStreamErrorCodeKey: -4, 
      _kCFStreamErrorDomainKey: 4, 
      NSErrorFailingURLKey: None, 
      NSErrorFailingURLStringKey: https://p100-sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/inAppBuy, 
      NSLocalizedDescription: Cannot connect to iTunes Store, 
      NSUnderlyingError: {
         code: "-1005", 
         domain: "kCFErrorDomainCFNetwork", 
         message: "underlying error", 
         nativeStackIOS: [...],
         userInfo:{"NSErrorPeerAddressKey":null,"_kCFStreamErrorCodeKey":-4,"_kCFStreamErrorDomainKey":4}
      }
   }
}

Pasos para reproducir el comportamiento

  1. Cree un usuario de prueba en App Store Connect
  2. Instale la aplicación desde la App Store (o invite al usuario de prueba a TestFlight e instale TestFlight y luego la aplicación a través de TestFlight)
  3. Compra una suscripción en la aplicación
  4. Deja que la suscripción caduque
  5. Cerrar sesión con ID de Apple de iOS (Configuración> ID de Apple, Cerrar sesión)
  6. Iniciar sesión con una nueva ID de Apple
  7. Compra una suscripción en la aplicación

¡Espero que esto ayude a alguien!

@hyochan

Después de probar muchas cosas sigo con el mismo problema y más. En el código siguiente, RNIap.buySubscription (sku) devuelve undefined. Por favor, ¿alguien lo resolvió?

''
static purchaseSubscriptionIOS = async (subscriptionID) => {
aguardar KinvoBilling.getSubscriptions ();

try {
  const purchaseResult = await RNIap.buySubscription(subscriptionID);
  return createResponse(true, purchaseResult);
} catch (error) {
  const subscription = RNIap.addAdditionalSuccessPurchaseListenerIOS(async (purchase) => {
    // dooboolab => check the call here.
    console.tron.log('--- ERROR ----');
    console.tron.log(error);
    console.tron.log('--- PURCHASE ----');
    console.tron.log(purchase);
    const result = purchase;
    subscription.remove();
    console.tron.log(result);

    if (result) {
      return createResponse(true, result);
    }
    return createResponse(false, result);
  });
}

};
''

: +1: Estamos experimentando este problema. Parece que le está sucediendo a aproximadamente el 10% de nuestros usuarios actualmente. Intentaremos agregar este oyente, pero no creo que, en última instancia, esta sea una gran solución. @hyochan ¿Hay alguna forma de que podamos obtener información más detallada en los casos en los que esto arroja, o es una respuesta estándar de las API de StoreKit? En todos los casos de error, el mensaje parece ser "No se puede conectar a iTunes Store", incluso cuando la compra se realiza correctamente.

Tenemos un problema muy similar con 3.4.6: el primer intento de compra falla con E_UNKOWN , el reintento se realiza correctamente. Sin embargo, para nosotros esto sucede con buyProduct , no con buySubscription . @hyochan, ¿ podría seguir siendo la misma causa raíz?

¡Hola! Estoy experimentando el mismo problema después de llamar a RNIap.requestSubscription () Obtengo un resultado indefinido pero el pago se realiza correctamente, se carga la tarjeta de crédito.

La única forma de que ese usuario lo supere es restaurando la compra.

¿Alguien consiguió una solución para esto? Estoy usando la versión 3.5.9

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