Solución de problemas

Empieza activando los registros de depuración: dicen exactamente qué hizo el SDK y por qué. Consulta Registros de depuración. Busca la etiqueta Unolink en Logcat, o [Unolink] en la consola de Xcode.

No aparece nada en el panel

  • Activa Incluir dispositivos de prueba en Embudo o Recorridos. Las builds de depuración son dispositivos de prueba y están ocultas de forma predeterminada.
  • Comprueba que configure se ejecuta. Hay que llamarlo una vez, pronto: Application.onCreate() en Android, el init() de la App con @main en iOS, el layout raíz en React Native, main() en Flutter.
  • Envía los eventos ya. Los eventos salen cada 15 segundos mientras la app está abierta, y cuando pasa a segundo plano. Pulsa Inicio, o llama a flush().
  • Comprueba la red. Sin conexión, los eventos esperan en el dispositivo y se envían cuando vuelve.

"Invalid SDK key (401)"

La clave es incorrecta, es de otra app o está revocada. Cópiala de nuevo desde tu app → Ajustes → Claves del SDK. Si no la guardaste cuando la creaste, crea una clave nueva: la clave completa solo se muestra una vez. Después de un 401 no se envía nada hasta el siguiente inicio.

El SDK forma parte del plan Pro y superiores. El propietario de la app tiene que mejorar su plan en Facturación. Hasta entonces, el SDK no envía nada y no deja nada en cola.

Faltan algunos eventos

  • Nombre no válido. Los nombres de eventos empiezan por una letra y solo usan letras, dígitos, _ y ., con un máximo de 64 caracteres. Los no válidos se rechazan y se registran.
  • Demasiadas propiedades. Como máximo 20 por evento, cadenas de hasta 200 caracteres, 4 KB en total.
  • IDs de pantallas de onboarding no válidos. step y flow siguen la misma regla que los nombres de eventos: how_heard, no how-heard. En las builds de desarrollo, el SDK de React Native (0.3.1 o posterior) avisa en la consola.
  • Muy por encima del cupo mensual. No se bloquea nada al llegar a tu cupo. Solo a partir del doble del cupo se rechazan tus propios eventos (personalizados), con quota_exceeded; los eventos estándar del embudo siempre se registran.
  • Llamados antes de configure. Los SDK nativos de iOS y Android ignoran las llamadas hechas antes de configure. React Native (0.3.1 o posterior) las guarda y las envía justo después.
  • Seguimiento desactivado. setEnabled(false) detiene el seguimiento y se recuerda entre inicios.

Las compras o pruebas se cuentan dos veces, o ninguna

  • ¿RevenueCat conectado? Entonces RevenueCat informa de las pruebas y compras, y las llamadas de la app a purchase y trialStarted se ignoran. Quítalas si quieres; no hacen daño.
  • ¿Las compras de RevenueCat no se unen a la instalación? Informa del propio ID de usuario de app de RevenueCat. Con el SDK 0.3.2 o posterior, connectRevenueCat lo mantiene al día (consulta RevenueCat). Si no, llama a setUserId con él (Purchases.shared.appUserID, Purchases.sharedInstance.appUserID, Purchases.getAppUserID() o Purchases.appUserID) después de Purchases.configure, después de cada Purchases.logIn y Purchases.logOut, y en cada inicio. Una compra que llega antes de que la app informe de su usuario espera, y se une en cuanto lo hace. Cuenta cada ID de usuario que haya informado una instalación, así que un invitado que compra y luego crea una cuenta conserva la compra. Si la app solo informa del ID de la cuenta, la compra de un invitado se une solo con el siguiente evento de RevenueCat para ese cliente (por ejemplo, la primera renovación). Consulta Invitados y cuentas.
  • ¿Sin RevenueCat? Llama a purchase con el precio como decimal y un código de moneda de tres letras, después de que la tienda la confirme.
  • En iPhone, es lo esperado. Apple no tiene referrer de instalación, así que los deep links diferidos son solo para Android.
  • Instala desde Google Play. Las instalaciones por sideload y desde Android Studio no tienen referrer de Play. Usa las pruebas internas, o debugInstallReferrer en una build de depuración. Consulta Pruebas.
  • Solo en el primer inicio. El referrer se lee una vez por instalación. Desinstala la app, o borra su almacenamiento, para volver a probar.
  • Pon un deep link en el enlace. En el panel, Enlaces → ⋯ → Editar → Enlace profundo. Un enlace sin deep link sigue atribuyéndose la instalación, pero no hay nada que abrir.
  • Registra el listener. Se puede añadir después de configure: un enlace que llegó antes se entrega igual. En React Native eso requiere 0.3.1 o posterior; con 0.3.0, suscríbete justo después de configure.
  • ¿La pantalla está detrás del onboarding o del inicio de sesión? El listener se ejecuta una vez por instalación. Cuando termine el onboarding, lee getPendingDeferredDeepLink(), abre el enlace y luego llama a consumeDeferredDeepLink(). Desde 0.3.3, el enlace espera hasta que lo consumas, aunque la app se cierre entretanto (hasta 30 días). Consulta Ábrelo después del onboarding.
  • ¿El mismo enlace se abre en cada inicio? Llama a consumeDeferredDeepLink() en cuanto lo hayas abierto.

Cada clic se atribuye a una sola instalación. Después de una reinstalación, Google Play puede volver a dar el mismo referrer a la app, y esa segunda instalación no se atribuye al enlace una segunda vez. Unolink nunca adivina.

React Native y Flutter

  • Expo Go no funciona. El SDK tiene código nativo: haz una development build (npx expo prebuild o EAS Build).
  • "Native module not found" o MissingPluginException. Vuelve a compilar la app después de instalarlo. Una recarga de JavaScript o un hot restart de Flutter no carga código nativo nuevo.
  • La build de iOS falla después de instalarlo. Ejecuta pod install en la carpeta ios (React Native sin Expo) y vuelve a compilar.

¿Sigues atascado?

Escribe a [email protected] con el nombre de tu app, la plataforma, la versión del SDK y el registro de depuración de un inicio de la app.