Crear APK gratis

API del puente de JavaScript

Facebook, eventos de Meta y Firebase Analytics

Inicio de sesión con Facebook, Meta App Events y Firebase Analytics con tus propias claves, definidas en la compilación. Analytics no recopila nada hasta que el usuario haya dado su consentimiento.

AppMint.analytics ayudante#

AppMint.analytics — one event to Firebase and Meta

Ejemplo

Registra un evento en todos los servicios de analítica que conectó la compilación: Firebase Analytics (tu propio google-services.json) y Meta App Events. Los nombres se limpian según las reglas de cada servicio y la respuesta indica qué se envió.

Devuelve: log(name, params) → {ok, providers: {firebase?, meta?}}, cada uno {ok, name, dropped} o {ok: false, error}. setUserId(id), setUserProperty(name, value), screenView(name, class), setEnabled(on) → Promesas; providers() → {firebase, meta}. Necesita: paso Integrar → Firebase Analytics (sube google-services.json en la tarjeta Push) y/o Meta App Events.

if (window.AppMint && AppMint.analytics) {
  AppMint.analytics.setUserId(currentUser.id);
  AppMint.analytics.setUserProperty('plan', 'pro');
  var r = await AppMint.analytics.log('add_to_cart', { item_id: 'sku-42', value: 19.99, currency: 'USD' });
  if (!r.ok) console.warn('not logged', r.providers);   // e.g. {firebase: {ok:false, error:'no_consent'}}
}

// Your own consent screen: nothing is collected while this is off (persisted).
document.getElementById('optOut').onchange = (e) => AppMint.analytics.setEnabled(!e.target.checked);

Iniciar y cerrar sesión mantienen el id de usuario sincronizado:

async function onAuthChange(user) {
  if (!(window.AppMint && AppMint.analytics)) return;
  if (user) {
    await AppMint.analytics.setUserId(user.id);
    await AppMint.analytics.setUserProperty('country', user.country);
  } else {
    await AppMint.analytics.setUserId('');           // clears it
  }
}

Comprueba qué servicios están conectados antes de depender de ellos:

if (window.AppMint && AppMint.analytics) {
  const p = await AppMint.analytics.providers();     // { firebase, meta }
  if (!p.firebase && !p.meta) console.warn('no analytics service is connected in this build');
  await AppMint.analytics.screenView('Settings', 'SettingsPage');
  const r = await AppMint.analytics.log('first_open_tip', { shown: true });
  if (!r.ok) console.warn('not logged', r.providers);
}

Notas: Consentimiento: cuando la app muestra anuncios, el formulario de consentimiento de Google también decide para la analítica: no se recopila nada antes de tener una respuesta, y donde se aplica el RGPD debe concederse el propósito 1; el setEnabled(false) de la página siempre prevalece. Mientras la recopilación está desactivada, las llamadas responden no_consent (nada se pone en cola). Nombres de Firebase: letras, dígitos y _, hasta 40 caracteres, como máximo 25 parámetros, valores de cadena de hasta 100 caracteres; los nombres reservados (first_open, session_start, firebase_…, google_…, ga_…) responden reserved_name / reserved_prefix. params.value (un número) se convierte en el value-to-sum de Meta. Con Registrar una vista de pantalla en cada cambio de página activado, los cambios de ruta registran screen_view automáticamente. Errores: not_configured, missing_google_app_id, params_not_json, invalid_name.

AppMint.facebook ayudante#

AppMint.facebook — Facebook Login and Meta App Events

Ejemplo

"Continuar con Facebook" en TU PROPIA app de Facebook. El inicio de sesión abre Facebook en una pestaña del navegador (Custom Tab): usa el inicio de sesión de facebook.com de ese navegador, NO la app de Facebook, y vuelve a la app cuando el usuario confirma. También registra Meta App Events cuando los activaste.

Devuelve: login(permissions) → una Promesa que siempre se resuelve: {ok: true, accessToken, userId, expires, grantedPermissions, declinedPermissions} o {ok: false, cancelled?, error}. getAccessToken() → el mismo objeto de token, o null si no hay sesión. logEvent(name, valueToSum, params) → {ok, name, dropped} (en cola y enviado por lotes) o {ok: false, error}. Necesita: el paso Integrar de la compilación → Inicio de sesión con Facebook con tu Facebook App ID y tu Client Token (y Meta App Events para logEvent).

Inicia sesión y luego usa el token con tu backend:

async function facebookSignIn() {
  if (!(window.AppMint && AppMint.facebook)) { alert('Open this page in the app'); return; }
  var r = await AppMint.facebook.login(['public_profile', 'email']);
  if (!r.ok) {
    if (r.cancelled) return;                          // the user backed out
    alert('Facebook sign-in failed: ' + (r.message || r.error));
    return;
  }
  // Firebase: firebase.auth().signInWithCredential(firebase.auth.FacebookAuthProvider.credential(r.accessToken))
  await fetch('/api/login/facebook', { method: 'POST', body: JSON.stringify({ token: r.accessToken }) });
  console.log('Signed in as', r.userId, 'until', new Date(r.expires));
}

var existing = AppMint.facebook.getAccessToken();   // null when signed out
if (existing) showSignedIn(existing.userId);

document.getElementById('logout').onclick = () => AppMint.facebook.logout();

Meta App Events:

AppMint.facebook.logEvent('fb_mobile_purchase', 9.99, { fb_currency: 'USD', fb_content_id: 'sku-42' });
AppMint.facebook.logEvent('Level Complete', null, { level: 3 });

Muestra el botón de Facebook solo dentro de la app y gestiona una configuración ausente:

const fb = window.AppMint && AppMint.facebook;
document.getElementById('fb-button').hidden = !fb;
if (fb) {
  document.getElementById('fb-button').onclick = async function () {
    const r = await fb.login(['public_profile']);
    if (r.ok || r.cancelled) return;
    if (r.error === 'not_configured') alert('Facebook sign-in is not set up in this build');
    else if (r.error === 'busy') console.log('a login is already open');
    else alert('Facebook sign-in failed: ' + (r.message || r.error));
  };
}

Notas: Facebook Developers → tu app → Inicio de sesión con Facebook → Configuración → URI de redireccionamiento de OAuth válidos: añade https://freewebtoapk.com/fb-return/ (el asistente tiene un botón Copiar). No hace falta clave hash ni configuración de plataforma Android. El token se verifica con Facebook (debe pertenecer a tu App ID) antes de que la promesa se resuelva. Si Android cerró la app mientras el usuario estaba en el navegador, el resultado no se entrega a una promesa: el token se guarda y getAccessToken() lo devuelve cuando la página arranca. Errores: not_configured, busy (ya hay un inicio de sesión abierto), cancelled (también cuando el usuario cierra la pestaña), state_mismatch, wrong_app, failed, no_token, foreign_origin (una página que no es la propia de la app). Los App Events (enviados desde la app a la API de App Events de Facebook con tu token de cliente) empiezan solo tras el consentimiento (consulta AppMint.analytics) y responden no_consent hasta entonces. El inicio de sesión web mediante redirecciones de Supabase o Firebase sigue funcionando como antes.

analyticsLogEvent puente#

window.WebToApk.analyticsLogEvent(name: String, paramsJson: String): String

Evento de Firebase; el nombre se limpia según las reglas de Firebase. Devuelve {ok, name, dropped} o {ok:false, error}.

Ejemplo

Los métodos sin procesar de Firebase Analytics detrás de AppMint.analytics: prefiere el envoltorio. Cada uno devuelve su respuesta como texto JSON: {ok, name, dropped} o {ok: false, error}.

Devuelve: texto JSON (analyticsSetEnabled no devuelve nada). Necesita: paso Integrar → Firebase Analytics, con tu google-services.json subido en la tarjeta de Notificaciones push.

var r = JSON.parse(WebToApk.analyticsLogEvent('share', JSON.stringify({ method: 'whatsapp', content_type: 'post' })));
if (!r.ok) console.warn(r.error);                        // 'no_consent', 'reserved_name', …
WebToApk.analyticsLogScreenView('/checkout', 'CheckoutPage');
WebToApk.analyticsSetUserId('user-123');                 // '' clears it
WebToApk.analyticsSetUserProperty('favorite_food', 'pizza');
WebToApk.analyticsSetEnabled(false);                     // stops every analytics provider

Detecta la función y luego registra una compra y una vista de pantalla:

if (window.WebToApk && WebToApk.analyticsLogEvent) {
  WebToApk.analyticsLogScreenView(location.pathname, 'ProductPage');
  document.getElementById('buy').onclick = function () {
    WebToApk.analyticsLogEvent('purchase', JSON.stringify({ value: 19.99, currency: 'USD', transaction_id: orderId }));
  };
}

Gestiona un evento rechazado y un interruptor de consentimiento:

function track(name, params) {
  if (!(window.WebToApk && WebToApk.analyticsLogEvent)) return;      // browser, or option off
  const r = JSON.parse(WebToApk.analyticsLogEvent(name, JSON.stringify(params || {})));
  if (!r.ok) console.warn('analytics dropped', name, r.error);       // 'no_consent', 'invalid_name', ...
}

document.getElementById('analytics-toggle').onchange = function (e) {
  WebToApk.analyticsSetEnabled(e.target.checked);
};
track('tutorial_complete', { step_count: 5 });

Notas: analyticsSetEnabled es el interruptor de consentimiento de la página para Firebase y Meta App Events a la vez; consulta AppMint.analytics para las reglas de consentimiento.

analyticsLogScreenView puente#

window.WebToApk.analyticsLogScreenView(screenName: String, screenClass: String): String

screen_view de Firebase para [screenName] (p. ej. la ruta de la página).

Ejemplo

Documentado junto con WebToApk.analyticsLogEvent: el ejemplo de allí también muestra este.

Los métodos sin procesar de Firebase Analytics detrás de AppMint.analytics: prefiere el envoltorio. Cada uno devuelve su respuesta como texto JSON: {ok, name, dropped} o {ok: false, error}.

Devuelve: texto JSON (analyticsSetEnabled no devuelve nada). Necesita: paso Integrar → Firebase Analytics, con tu google-services.json subido en la tarjeta de Notificaciones push.

var r = JSON.parse(WebToApk.analyticsLogEvent('share', JSON.stringify({ method: 'whatsapp', content_type: 'post' })));
if (!r.ok) console.warn(r.error);                        // 'no_consent', 'reserved_name', …
WebToApk.analyticsLogScreenView('/checkout', 'CheckoutPage');
WebToApk.analyticsSetUserId('user-123');                 // '' clears it
WebToApk.analyticsSetUserProperty('favorite_food', 'pizza');
WebToApk.analyticsSetEnabled(false);                     // stops every analytics provider

Detecta la función y luego registra una compra y una vista de pantalla:

if (window.WebToApk && WebToApk.analyticsLogEvent) {
  WebToApk.analyticsLogScreenView(location.pathname, 'ProductPage');
  document.getElementById('buy').onclick = function () {
    WebToApk.analyticsLogEvent('purchase', JSON.stringify({ value: 19.99, currency: 'USD', transaction_id: orderId }));
  };
}

Gestiona un evento rechazado y un interruptor de consentimiento:

function track(name, params) {
  if (!(window.WebToApk && WebToApk.analyticsLogEvent)) return;      // browser, or option off
  const r = JSON.parse(WebToApk.analyticsLogEvent(name, JSON.stringify(params || {})));
  if (!r.ok) console.warn('analytics dropped', name, r.error);       // 'no_consent', 'invalid_name', ...
}

document.getElementById('analytics-toggle').onchange = function (e) {
  WebToApk.analyticsSetEnabled(e.target.checked);
};
track('tutorial_complete', { step_count: 5 });

Notas: analyticsSetEnabled es el interruptor de consentimiento de la página para Firebase y Meta App Events a la vez; consulta AppMint.analytics para las reglas de consentimiento.

analyticsSetEnabled puente#

window.WebToApk.analyticsSetEnabled(enabled: Boolean)

El interruptor de analítica propio de la página para todos los proveedores; se persiste.

Ejemplo

Documentado junto con WebToApk.analyticsLogEvent: el ejemplo de allí también muestra este.

Los métodos sin procesar de Firebase Analytics detrás de AppMint.analytics: prefiere el envoltorio. Cada uno devuelve su respuesta como texto JSON: {ok, name, dropped} o {ok: false, error}.

Devuelve: texto JSON (analyticsSetEnabled no devuelve nada). Necesita: paso Integrar → Firebase Analytics, con tu google-services.json subido en la tarjeta de Notificaciones push.

var r = JSON.parse(WebToApk.analyticsLogEvent('share', JSON.stringify({ method: 'whatsapp', content_type: 'post' })));
if (!r.ok) console.warn(r.error);                        // 'no_consent', 'reserved_name', …
WebToApk.analyticsLogScreenView('/checkout', 'CheckoutPage');
WebToApk.analyticsSetUserId('user-123');                 // '' clears it
WebToApk.analyticsSetUserProperty('favorite_food', 'pizza');
WebToApk.analyticsSetEnabled(false);                     // stops every analytics provider

Detecta la función y luego registra una compra y una vista de pantalla:

if (window.WebToApk && WebToApk.analyticsLogEvent) {
  WebToApk.analyticsLogScreenView(location.pathname, 'ProductPage');
  document.getElementById('buy').onclick = function () {
    WebToApk.analyticsLogEvent('purchase', JSON.stringify({ value: 19.99, currency: 'USD', transaction_id: orderId }));
  };
}

Gestiona un evento rechazado y un interruptor de consentimiento:

function track(name, params) {
  if (!(window.WebToApk && WebToApk.analyticsLogEvent)) return;      // browser, or option off
  const r = JSON.parse(WebToApk.analyticsLogEvent(name, JSON.stringify(params || {})));
  if (!r.ok) console.warn('analytics dropped', name, r.error);       // 'no_consent', 'invalid_name', ...
}

document.getElementById('analytics-toggle').onchange = function (e) {
  WebToApk.analyticsSetEnabled(e.target.checked);
};
track('tutorial_complete', { step_count: 5 });

Notas: analyticsSetEnabled es el interruptor de consentimiento de la página para Firebase y Meta App Events a la vez; consulta AppMint.analytics para las reglas de consentimiento.

analyticsSetUserId puente#

window.WebToApk.analyticsSetUserId(userId: String): String

Id de usuario de Firebase ("" lo borra).

Ejemplo

Documentado junto con WebToApk.analyticsLogEvent: el ejemplo de allí también muestra este.

Los métodos sin procesar de Firebase Analytics detrás de AppMint.analytics: prefiere el envoltorio. Cada uno devuelve su respuesta como texto JSON: {ok, name, dropped} o {ok: false, error}.

Devuelve: texto JSON (analyticsSetEnabled no devuelve nada). Necesita: paso Integrar → Firebase Analytics, con tu google-services.json subido en la tarjeta de Notificaciones push.

var r = JSON.parse(WebToApk.analyticsLogEvent('share', JSON.stringify({ method: 'whatsapp', content_type: 'post' })));
if (!r.ok) console.warn(r.error);                        // 'no_consent', 'reserved_name', …
WebToApk.analyticsLogScreenView('/checkout', 'CheckoutPage');
WebToApk.analyticsSetUserId('user-123');                 // '' clears it
WebToApk.analyticsSetUserProperty('favorite_food', 'pizza');
WebToApk.analyticsSetEnabled(false);                     // stops every analytics provider

Detecta la función y luego registra una compra y una vista de pantalla:

if (window.WebToApk && WebToApk.analyticsLogEvent) {
  WebToApk.analyticsLogScreenView(location.pathname, 'ProductPage');
  document.getElementById('buy').onclick = function () {
    WebToApk.analyticsLogEvent('purchase', JSON.stringify({ value: 19.99, currency: 'USD', transaction_id: orderId }));
  };
}

Gestiona un evento rechazado y un interruptor de consentimiento:

function track(name, params) {
  if (!(window.WebToApk && WebToApk.analyticsLogEvent)) return;      // browser, or option off
  const r = JSON.parse(WebToApk.analyticsLogEvent(name, JSON.stringify(params || {})));
  if (!r.ok) console.warn('analytics dropped', name, r.error);       // 'no_consent', 'invalid_name', ...
}

document.getElementById('analytics-toggle').onchange = function (e) {
  WebToApk.analyticsSetEnabled(e.target.checked);
};
track('tutorial_complete', { step_count: 5 });

Notas: analyticsSetEnabled es el interruptor de consentimiento de la página para Firebase y Meta App Events a la vez; consulta AppMint.analytics para las reglas de consentimiento.

analyticsSetUserProperty puente#

window.WebToApk.analyticsSetUserProperty(name: String, value: String): String

Propiedad de usuario de Firebase (nombre de hasta 24 caracteres, valor de hasta 36; "" la borra).

Ejemplo

Documentado junto con WebToApk.analyticsLogEvent: el ejemplo de allí también muestra este.

Los métodos sin procesar de Firebase Analytics detrás de AppMint.analytics: prefiere el envoltorio. Cada uno devuelve su respuesta como texto JSON: {ok, name, dropped} o {ok: false, error}.

Devuelve: texto JSON (analyticsSetEnabled no devuelve nada). Necesita: paso Integrar → Firebase Analytics, con tu google-services.json subido en la tarjeta de Notificaciones push.

var r = JSON.parse(WebToApk.analyticsLogEvent('share', JSON.stringify({ method: 'whatsapp', content_type: 'post' })));
if (!r.ok) console.warn(r.error);                        // 'no_consent', 'reserved_name', …
WebToApk.analyticsLogScreenView('/checkout', 'CheckoutPage');
WebToApk.analyticsSetUserId('user-123');                 // '' clears it
WebToApk.analyticsSetUserProperty('favorite_food', 'pizza');
WebToApk.analyticsSetEnabled(false);                     // stops every analytics provider

Detecta la función y luego registra una compra y una vista de pantalla:

if (window.WebToApk && WebToApk.analyticsLogEvent) {
  WebToApk.analyticsLogScreenView(location.pathname, 'ProductPage');
  document.getElementById('buy').onclick = function () {
    WebToApk.analyticsLogEvent('purchase', JSON.stringify({ value: 19.99, currency: 'USD', transaction_id: orderId }));
  };
}

Gestiona un evento rechazado y un interruptor de consentimiento:

function track(name, params) {
  if (!(window.WebToApk && WebToApk.analyticsLogEvent)) return;      // browser, or option off
  const r = JSON.parse(WebToApk.analyticsLogEvent(name, JSON.stringify(params || {})));
  if (!r.ok) console.warn('analytics dropped', name, r.error);       // 'no_consent', 'invalid_name', ...
}

document.getElementById('analytics-toggle').onchange = function (e) {
  WebToApk.analyticsSetEnabled(e.target.checked);
};
track('tutorial_complete', { step_count: 5 });

Notas: analyticsSetEnabled es el interruptor de consentimiento de la página para Firebase y Meta App Events a la vez; consulta AppMint.analytics para las reglas de consentimiento.

facebookLogEvent puente#

window.WebToApk.facebookLogEvent(name: String, valueToSum: String, paramsJson: String): String

Evento de Meta App; [valueToSum] un número como texto o ""; [paramsJson] un objeto JSON plano. Devuelve {ok, name, dropped} o {ok:false, error}.

Ejemplo

Documentado junto con WebToApk.facebookLogin: el ejemplo de allí también muestra este.

Los métodos sin procesar detrás de AppMint.facebook: prefiere el envoltorio de promesas. Compilada con tu Facebook App ID + Client Token (paso Integrar); sin ellos cada llamada responde not_configured.

Devuelve: facebookLogin(permissionsCsv, callbackId) resuelve window.__appmintReplies[callbackId]; con un callbackId vacío la respuesta llega como el evento appmint:facebook-login. getFacebookAccessToken() devuelve el JSON del token o "". facebookLogEvent(name, valueToSum, paramsJson) devuelve {ok, name, dropped} como texto JSON (valueToSum es un número como texto, o ""). Necesita: Inicio de sesión con Facebook activado en la compilación.

window.addEventListener('appmint:facebook-login', (e) => {
  if (e.detail.ok) console.log('token', e.detail.accessToken);
  else if (!e.detail.cancelled) console.warn(e.detail.error);
});
WebToApk.facebookLogin('public_profile,email', '');

var t = WebToApk.getFacebookAccessToken();          // '' when signed out
var logged = JSON.parse(WebToApk.facebookLogEvent('Subscribe', '4.99', JSON.stringify({ plan: 'monthly' })));
WebToApk.facebookLogout();

Oculta el botón cuando el inicio de sesión con Facebook no está configurado en esta compilación:

var btn = document.getElementById('fb-login');
btn.hidden = !(window.WebToApk && WebToApk.facebookLogin);

btn.addEventListener('click', function () {
  window.addEventListener('appmint:facebook-login', function onLogin(e) {
    window.removeEventListener('appmint:facebook-login', onLogin);
    if (e.detail.ok) showProfile(e.detail.accessToken);
    else if (e.detail.error === 'not_configured') btn.hidden = true;   // built without the Facebook App ID
  });
  WebToApk.facebookLogin('public_profile', '');
});

Registra un evento de compra y cierra la sesión:

function trackPurchase(amount, currency) {
  if (!(window.WebToApk && WebToApk.facebookLogEvent)) return;
  var r = JSON.parse(WebToApk.facebookLogEvent('Purchase', String(amount), JSON.stringify({ currency: currency })));
  if (!r.ok) console.warn('event not logged');
}

document.getElementById('fb-signout').addEventListener('click', function () {
  if (window.WebToApk && WebToApk.facebookLogout) WebToApk.facebookLogout();
  showSignedOut();
});

Notas: Implementado en FacebookBridge.kt sin ningún SDK de Facebook: el inicio de sesión es el flujo web manual de Facebook en una pestaña del navegador, y los App Events van a la Graph API de App Events de Facebook.

facebookLogin puente#

window.WebToApk.facebookLogin(permissionsCsv: String, callbackId: String)

Inicio de sesión nativo de Facebook; [permissionsCsv] p. ej. "public_profile,email". Resuelve [callbackId], o dispara `appmint:facebook-login` cuando está vacío.

Ejemplo

Los métodos sin procesar detrás de AppMint.facebook: prefiere el envoltorio de promesas. Compilada con tu Facebook App ID + Client Token (paso Integrar); sin ellos cada llamada responde not_configured.

Devuelve: facebookLogin(permissionsCsv, callbackId) resuelve window.__appmintReplies[callbackId]; con un callbackId vacío la respuesta llega como el evento appmint:facebook-login. getFacebookAccessToken() devuelve el JSON del token o "". facebookLogEvent(name, valueToSum, paramsJson) devuelve {ok, name, dropped} como texto JSON (valueToSum es un número como texto, o ""). Necesita: Inicio de sesión con Facebook activado en la compilación.

window.addEventListener('appmint:facebook-login', (e) => {
  if (e.detail.ok) console.log('token', e.detail.accessToken);
  else if (!e.detail.cancelled) console.warn(e.detail.error);
});
WebToApk.facebookLogin('public_profile,email', '');

var t = WebToApk.getFacebookAccessToken();          // '' when signed out
var logged = JSON.parse(WebToApk.facebookLogEvent('Subscribe', '4.99', JSON.stringify({ plan: 'monthly' })));
WebToApk.facebookLogout();

Oculta el botón cuando el inicio de sesión con Facebook no está configurado en esta compilación:

var btn = document.getElementById('fb-login');
btn.hidden = !(window.WebToApk && WebToApk.facebookLogin);

btn.addEventListener('click', function () {
  window.addEventListener('appmint:facebook-login', function onLogin(e) {
    window.removeEventListener('appmint:facebook-login', onLogin);
    if (e.detail.ok) showProfile(e.detail.accessToken);
    else if (e.detail.error === 'not_configured') btn.hidden = true;   // built without the Facebook App ID
  });
  WebToApk.facebookLogin('public_profile', '');
});

Registra un evento de compra y cierra la sesión:

function trackPurchase(amount, currency) {
  if (!(window.WebToApk && WebToApk.facebookLogEvent)) return;
  var r = JSON.parse(WebToApk.facebookLogEvent('Purchase', String(amount), JSON.stringify({ currency: currency })));
  if (!r.ok) console.warn('event not logged');
}

document.getElementById('fb-signout').addEventListener('click', function () {
  if (window.WebToApk && WebToApk.facebookLogout) WebToApk.facebookLogout();
  showSignedOut();
});

Notas: Implementado en FacebookBridge.kt sin ningún SDK de Facebook: el inicio de sesión es el flujo web manual de Facebook en una pestaña del navegador, y los App Events van a la Graph API de App Events de Facebook.

facebookLogout puente#

window.WebToApk.facebookLogout()

Cierra la sesión del usuario de Facebook en esta app (borra el token de acceso en caché).

Ejemplo

Documentado junto con WebToApk.facebookLogin: el ejemplo de allí también muestra este.

Los métodos sin procesar detrás de AppMint.facebook: prefiere el envoltorio de promesas. Compilada con tu Facebook App ID + Client Token (paso Integrar); sin ellos cada llamada responde not_configured.

Devuelve: facebookLogin(permissionsCsv, callbackId) resuelve window.__appmintReplies[callbackId]; con un callbackId vacío la respuesta llega como el evento appmint:facebook-login. getFacebookAccessToken() devuelve el JSON del token o "". facebookLogEvent(name, valueToSum, paramsJson) devuelve {ok, name, dropped} como texto JSON (valueToSum es un número como texto, o ""). Necesita: Inicio de sesión con Facebook activado en la compilación.

window.addEventListener('appmint:facebook-login', (e) => {
  if (e.detail.ok) console.log('token', e.detail.accessToken);
  else if (!e.detail.cancelled) console.warn(e.detail.error);
});
WebToApk.facebookLogin('public_profile,email', '');

var t = WebToApk.getFacebookAccessToken();          // '' when signed out
var logged = JSON.parse(WebToApk.facebookLogEvent('Subscribe', '4.99', JSON.stringify({ plan: 'monthly' })));
WebToApk.facebookLogout();

Oculta el botón cuando el inicio de sesión con Facebook no está configurado en esta compilación:

var btn = document.getElementById('fb-login');
btn.hidden = !(window.WebToApk && WebToApk.facebookLogin);

btn.addEventListener('click', function () {
  window.addEventListener('appmint:facebook-login', function onLogin(e) {
    window.removeEventListener('appmint:facebook-login', onLogin);
    if (e.detail.ok) showProfile(e.detail.accessToken);
    else if (e.detail.error === 'not_configured') btn.hidden = true;   // built without the Facebook App ID
  });
  WebToApk.facebookLogin('public_profile', '');
});

Registra un evento de compra y cierra la sesión:

function trackPurchase(amount, currency) {
  if (!(window.WebToApk && WebToApk.facebookLogEvent)) return;
  var r = JSON.parse(WebToApk.facebookLogEvent('Purchase', String(amount), JSON.stringify({ currency: currency })));
  if (!r.ok) console.warn('event not logged');
}

document.getElementById('fb-signout').addEventListener('click', function () {
  if (window.WebToApk && WebToApk.facebookLogout) WebToApk.facebookLogout();
  showSignedOut();
});

Notas: Implementado en FacebookBridge.kt sin ningún SDK de Facebook: el inicio de sesión es el flujo web manual de Facebook en una pestaña del navegador, y los App Events van a la Graph API de App Events de Facebook.

getFacebookAccessToken puente#

window.WebToApk.getFacebookAccessToken(): String

El token de acceso actual de Facebook como JSON {accessToken, userId, expires, grantedPermissions, declinedPermissions}, o "" cuando no hay sesión.

Ejemplo

Documentado junto con WebToApk.facebookLogin: el ejemplo de allí también muestra este.

Los métodos sin procesar detrás de AppMint.facebook: prefiere el envoltorio de promesas. Compilada con tu Facebook App ID + Client Token (paso Integrar); sin ellos cada llamada responde not_configured.

Devuelve: facebookLogin(permissionsCsv, callbackId) resuelve window.__appmintReplies[callbackId]; con un callbackId vacío la respuesta llega como el evento appmint:facebook-login. getFacebookAccessToken() devuelve el JSON del token o "". facebookLogEvent(name, valueToSum, paramsJson) devuelve {ok, name, dropped} como texto JSON (valueToSum es un número como texto, o ""). Necesita: Inicio de sesión con Facebook activado en la compilación.

window.addEventListener('appmint:facebook-login', (e) => {
  if (e.detail.ok) console.log('token', e.detail.accessToken);
  else if (!e.detail.cancelled) console.warn(e.detail.error);
});
WebToApk.facebookLogin('public_profile,email', '');

var t = WebToApk.getFacebookAccessToken();          // '' when signed out
var logged = JSON.parse(WebToApk.facebookLogEvent('Subscribe', '4.99', JSON.stringify({ plan: 'monthly' })));
WebToApk.facebookLogout();

Oculta el botón cuando el inicio de sesión con Facebook no está configurado en esta compilación:

var btn = document.getElementById('fb-login');
btn.hidden = !(window.WebToApk && WebToApk.facebookLogin);

btn.addEventListener('click', function () {
  window.addEventListener('appmint:facebook-login', function onLogin(e) {
    window.removeEventListener('appmint:facebook-login', onLogin);
    if (e.detail.ok) showProfile(e.detail.accessToken);
    else if (e.detail.error === 'not_configured') btn.hidden = true;   // built without the Facebook App ID
  });
  WebToApk.facebookLogin('public_profile', '');
});

Registra un evento de compra y cierra la sesión:

function trackPurchase(amount, currency) {
  if (!(window.WebToApk && WebToApk.facebookLogEvent)) return;
  var r = JSON.parse(WebToApk.facebookLogEvent('Purchase', String(amount), JSON.stringify({ currency: currency })));
  if (!r.ok) console.warn('event not logged');
}

document.getElementById('fb-signout').addEventListener('click', function () {
  if (window.WebToApk && WebToApk.facebookLogout) WebToApk.facebookLogout();
  showSignedOut();
});

Notas: Implementado en FacebookBridge.kt sin ningún SDK de Facebook: el inicio de sesión es el flujo web manual de Facebook en una pestaña del navegador, y los App Events van a la Graph API de App Events de Facebook.

Generado a partir del runtime de la app y sus archivos de ejemplo en cada compilación de la documentación. Léelo como Markdown · Todas las familias.

Comprobado con el puente publicado el 2026-10-22.