Saltar al contenido principal
El SDK 2.0 se autentica con un token de licencia. Las plataformas nativas también pueden usar appId + appKey para autenticación en línea. En Web nunca debes incrustar appKey en el JavaScript del frontend.
Completa primero la Suscripción: vincula los identificadores de tu app en la Consola (Bundle ID / nombre de paquete / dominio) y activa un plan.

Nativo (Android / iOS / macOS / Windows)

Pasa una de las siguientes opciones al crear el motor: Prioridad: si licenseToken no está vacío, el SDK valida ese token en local y no llama a la red con appId / appKey.
Recomendado (la misma idea que en Web): guarda appId / appKey en tu servidor, genera un licenseToken de corta duración y envíalo a la app. Establece platform en la petición firmada para que coincida con el cliente (ios / android / macos / windows). Consulta Web → Proxy del servidor más abajo. appId + appKey directo y .lic sin conexión siguen admitidos.
iOS / macOS
Android
C++ (Windows)
Alternativa en línea en plataformas nativas:
Prefiere incluir el .lic sin conexión como asset de la app y cargarlo en tiempo de ejecución, en lugar de hardcodearlo en el código fuente. Cómo obtenerlo: Licencia sin conexión más abajo.

Web

El SDK del navegador no tiene campos appId / appKey. El motor solo acepta licenseToken y lo verifica en local. Obtén el token desde tu servidor antes de init().

Flujo recomendado

  1. Crea una app en la Consola, vincula tu dominio Web y copia appId / appKey (consulta Suscripción)
  2. Guarda las claves en tu backend; expón un endpoint (por ejemplo POST /api/facebetter/auth)
  3. Tu backend firma una petición a https://facebetter.pixpark.net/facebetter/v2/auth y devuelve el cuerpo de respuesta en bruto a la página
  4. Pasa esa cadena a EngineConfig.licenseToken y luego llama a init()
El demo oficial (demo/web/react) usa el mismo patrón: frontend en src/fetchLicenseToken.js, proxy del servidor en api/facebetter/auth.js.
No pongas appKey en un bundle de frontend. Un .lic sin conexión en la web debe coincidir con el origen de la página, por ejemplo https://app.example.com. Electron no comprueba el origen. Los tokens en línea caducan en minutos: obtén uno nuevo antes de volver a crear el motor.

Frontend

Proxy del servidor (ejemplo Node)

Guarda FB_APP_ID / FB_APP_KEY en variables de entorno. Coloca esto en Express / Fastify / una función serverless:
En otros lenguajes, implementa los mismos pasos: construye la cadena a firmar → HMAC-SHA256 (hex) → POST al upstream → entrega el cuerpo al frontend. Referencia ejecutable: GitHub Demo api/facebetter/auth.js.

Campos de la petición upstream

Si tiene éxito, el upstream devuelve JSON (incluido un campo token). Puedes reenviar el texto de la respuesta tal cual, o extraer solo la cadena token: el SDK acepta ambos.

Licencia sin conexión

Descarga un .lic sin conexión en la página de credenciales de la Consola y pasa el contenido completo como licenseToken / license_token. Los planes de pago bloquean cada identificador guardado. Una plataforma vacía se puede completar una vez. Para cambiar un valor bloqueado, contacta con soporte. Los planes gratis pueden editar identificadores y descargar en cualquier momento. El archivo caduca 15 días después de que termine la suscripción. Volver a descargarlo no alarga esa fecha. Tras renovar, descarga un archivo nuevo.

Notas

  • Los tokens en línea y las licencias sin conexión comprueban el identificador de la Consola: iOS y macOS usan el Bundle ID, Android el nombre del paquete, Windows y Linux el nombre del ejecutable, y un navegador el origen de la página. Electron no comprueba el origen. Si no coinciden, la validación falla.
  • Si no ha caducado: las funciones siguen tu plan de suscripción.
  • Si ha caducado: el motor aún puede inicializarse, pero las capacidades vuelven al plan Free (prueba con marca de agua). Tras renovar, descarga un archivo nuevo en la Consola.
  • Las licencias sin conexión en la web están vinculadas al origen de la página. Pasa el .lic completo como licenseToken.

Eventos del motor

Escucha los resultados de licencia e inicialización con onEngineEvent: