2.2.2
(porque cualquier versión más nueva falla en iOS debido a # 279)
iOS
No debe arrojarse ningún error. La compra fue exitosa (en vivo y en producción)
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"}
Dispositivo real. Clientes vivos. Muy consistentemente falla
Al probar el procedimiento con usuarios de Sandbox, el error no se puede reproducir.
@ 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:
Otra duda: ¿Tengo que usar finishTransaction () también en las suscripciones?
También veo este error. Y creo que conozco una forma de reproducirlo.
^ 2.4.1
https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz
iOS, al probar en TestFlight en un dispositivo real.
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.
{
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}
}
}
}
¡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
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.