Criar APK grátis

API da ponte JavaScript

Facebook, eventos da Meta e Firebase Analytics

Facebook Login, Meta App Events e Firebase Analytics com as chaves do próprio criador, definidas na compilação. O Analytics não coleta nada até o usuário dar consentimento.

AppMint.analytics helper#

AppMint.analytics — one event to Firebase and Meta

Exemplo

Registra um evento em todos os serviços de analytics que a compilação conectou: Firebase Analytics (seu próprio google-services.json) e Meta App Events. Os nomes são ajustados às regras de cada serviço e a resposta diz o que foi enviado.

Retorna: log(name, params) → {ok, providers: {firebase?, meta?}}, cada um {ok, name, dropped} ou {ok: false, error}. setUserId(id), setUserProperty(name, value), screenView(name, class), setEnabled(on) → Promises; providers() → {firebase, meta}. Requer: etapa Integrar → Firebase Analytics (envie o google-services.json no cartão Push) e/ou 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);

Entrar e sair mantêm o ID do usuário 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
  }
}

Veja quais serviços estão conectados antes de depender deles:

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);
}

Observações: Consentimento: quando o app exibe anúncios, o formulário de consentimento do Google também decide para o analytics - nada é coletado antes de haver uma resposta, e onde o GDPR se aplica a finalidade 1 precisa ser concedida; o setEnabled(false) da própria página sempre prevalece. Enquanto a coleta está desligada, as chamadas respondem no_consent (nada é enfileirado). Nomes no Firebase: letras, dígitos e _, até 40 caracteres, no máximo 25 parâmetros, valores de string de até 100 caracteres; nomes reservados (first_open, session_start, firebase_…, google_…, ga_…) respondem reserved_name / reserved_prefix. params.value (um número) vira o value-to-sum da Meta. Com Registrar uma visualização de tela a cada mudança de página ativado, as mudanças de rota registram screen_view automaticamente. Erros: not_configured, missing_google_app_id, params_not_json, invalid_name.

AppMint.facebook helper#

AppMint.facebook — Facebook Login and Meta App Events

Exemplo

"Continuar com o Facebook" no SEU PRÓPRIO app do Facebook. O login abre o Facebook em uma aba do navegador (Custom Tab): ele usa o login do facebook.com desse navegador, NÃO o app do Facebook, e volta ao app quando o usuário confirma. Também registra Meta App Events quando você os ativou.

Retorna: login(permissions) → uma Promise que sempre é resolvida: {ok: true, accessToken, userId, expires, grantedPermissions, declinedPermissions} ou {ok: false, cancelled?, error}. getAccessToken() → o mesmo objeto de token, ou null quando não há login. logEvent(name, valueToSum, params) → {ok, name, dropped} (enfileirado e enviado em lotes) ou {ok: false, error}. Requer: a etapa Integrar da compilação → Facebook Login com seu App ID e Client Token do Facebook (e Meta App Events para logEvent).

Entre e depois use o token com seu 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 });

Mostre o botão do Facebook só dentro do app e trate uma configuração 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));
  };
}

Observações: Facebook Developers → seu app → Facebook Login → Configurações → URIs de redirecionamento OAuth válidos: adicione https://freewebtoapk.com/fb-return/ (o assistente tem um botão Copiar). Não é preciso hash de chave nem configuração de plataforma Android. O token é verificado com o Facebook (ele precisa pertencer ao seu App ID) antes de a promise ser resolvida. Se o Android encerrou o app enquanto o usuário estava no navegador, o resultado não é entregue a uma promise - o token é guardado e getAccessToken() o retorna quando a página inicia. Erros: not_configured, busy (já há um login aberto), cancelled (também quando o usuário fecha a aba), state_mismatch, wrong_app, failed, no_token, foreign_origin (uma página que não é a do próprio app). Os App Events (enviados do app para a API de App Events do Facebook com seu client token) só começam após o consentimento (veja AppMint.analytics) e respondem no_consent até lá. O login na web via redirecionamentos do Supabase ou Firebase continua funcionando como antes.

analyticsLogEvent ponte#

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

Evento do Firebase; o nome é ajustado às regras do Firebase. Retorna {ok, name, dropped} ou {ok:false, error}.

Exemplo

Os métodos brutos do Firebase Analytics por trás de AppMint.analytics - prefira o wrapper. Cada um retorna sua resposta como texto JSON: {ok, name, dropped} ou {ok: false, error}.

Retorna: texto JSON (analyticsSetEnabled não retorna nada). Requer: etapa Integrar → Firebase Analytics, com seu google-services.json enviado no cartão Notificações 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

Detecte o recurso e depois registre uma compra e a visualização de uma tela:

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 }));
  };
}

Trate um evento recusado e uma chave de consentimento:

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 });

Observações: analyticsSetEnabled é a chave de consentimento da página para o Firebase e o Meta App Events juntos; veja AppMint.analytics para as regras de consentimento.

analyticsLogScreenView ponte#

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

screen_view do Firebase para [screenName] (por ex. o caminho da rota).

Exemplo

Documentado junto com WebToApk.analyticsLogEvent - o exemplo de lá mostra este também.

Os métodos brutos do Firebase Analytics por trás de AppMint.analytics - prefira o wrapper. Cada um retorna sua resposta como texto JSON: {ok, name, dropped} ou {ok: false, error}.

Retorna: texto JSON (analyticsSetEnabled não retorna nada). Requer: etapa Integrar → Firebase Analytics, com seu google-services.json enviado no cartão Notificações 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

Detecte o recurso e depois registre uma compra e a visualização de uma tela:

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 }));
  };
}

Trate um evento recusado e uma chave de consentimento:

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 });

Observações: analyticsSetEnabled é a chave de consentimento da página para o Firebase e o Meta App Events juntos; veja AppMint.analytics para as regras de consentimento.

analyticsSetEnabled ponte#

window.WebToApk.analyticsSetEnabled(enabled: Boolean)

A chave de analytics da própria página para todos os provedores; persistida.

Exemplo

Documentado junto com WebToApk.analyticsLogEvent - o exemplo de lá mostra este também.

Os métodos brutos do Firebase Analytics por trás de AppMint.analytics - prefira o wrapper. Cada um retorna sua resposta como texto JSON: {ok, name, dropped} ou {ok: false, error}.

Retorna: texto JSON (analyticsSetEnabled não retorna nada). Requer: etapa Integrar → Firebase Analytics, com seu google-services.json enviado no cartão Notificações 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

Detecte o recurso e depois registre uma compra e a visualização de uma tela:

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 }));
  };
}

Trate um evento recusado e uma chave de consentimento:

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 });

Observações: analyticsSetEnabled é a chave de consentimento da página para o Firebase e o Meta App Events juntos; veja AppMint.analytics para as regras de consentimento.

analyticsSetUserId ponte#

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

ID de usuário do Firebase ("" o limpa).

Exemplo

Documentado junto com WebToApk.analyticsLogEvent - o exemplo de lá mostra este também.

Os métodos brutos do Firebase Analytics por trás de AppMint.analytics - prefira o wrapper. Cada um retorna sua resposta como texto JSON: {ok, name, dropped} ou {ok: false, error}.

Retorna: texto JSON (analyticsSetEnabled não retorna nada). Requer: etapa Integrar → Firebase Analytics, com seu google-services.json enviado no cartão Notificações 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

Detecte o recurso e depois registre uma compra e a visualização de uma tela:

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 }));
  };
}

Trate um evento recusado e uma chave de consentimento:

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 });

Observações: analyticsSetEnabled é a chave de consentimento da página para o Firebase e o Meta App Events juntos; veja AppMint.analytics para as regras de consentimento.

analyticsSetUserProperty ponte#

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

Propriedade de usuário do Firebase (nome de até 24 caracteres, valor de até 36; "" a limpa).

Exemplo

Documentado junto com WebToApk.analyticsLogEvent - o exemplo de lá mostra este também.

Os métodos brutos do Firebase Analytics por trás de AppMint.analytics - prefira o wrapper. Cada um retorna sua resposta como texto JSON: {ok, name, dropped} ou {ok: false, error}.

Retorna: texto JSON (analyticsSetEnabled não retorna nada). Requer: etapa Integrar → Firebase Analytics, com seu google-services.json enviado no cartão Notificações 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

Detecte o recurso e depois registre uma compra e a visualização de uma tela:

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 }));
  };
}

Trate um evento recusado e uma chave de consentimento:

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 });

Observações: analyticsSetEnabled é a chave de consentimento da página para o Firebase e o Meta App Events juntos; veja AppMint.analytics para as regras de consentimento.

facebookLogEvent ponte#

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

Meta App Event; [valueToSum] um número como texto ou ""; [paramsJson] um objeto JSON simples. Retorna {ok, name, dropped} ou {ok:false, error}.

Exemplo

Documentado junto com WebToApk.facebookLogin - o exemplo de lá mostra este também.

Os métodos brutos por trás de AppMint.facebook - prefira o wrapper com promises. Compilado com seu App ID + Client Token do Facebook (etapa Integrar); sem eles, toda chamada responde not_configured.

Retorna: facebookLogin(permissionsCsv, callbackId) resolve window.__appmintReplies[callbackId]; com um callbackId vazio a resposta chega como o evento appmint:facebook-login. getFacebookAccessToken() retorna o JSON do token ou "". facebookLogEvent(name, valueToSum, paramsJson) retorna {ok, name, dropped} como texto JSON (valueToSum é um número como texto, ou ""). Requer: Facebook Login ativado na compilação.

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();

Oculte o botão quando o login do Facebook não estiver configurado nesta compilação:

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', '');
});

Registre um evento de compra e saia:

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();
});

Observações: Implementado em FacebookBridge.kt sem nenhum SDK do Facebook: o login é o fluxo web manual do Facebook em uma aba do navegador, e os App Events vão para a Graph API de App Events do Facebook.

facebookLogin ponte#

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

Login nativo do Facebook; [permissionsCsv] por ex. "public_profile,email". Resolve [callbackId], ou dispara `appmint:facebook-login` quando está em branco.

Exemplo

Os métodos brutos por trás de AppMint.facebook - prefira o wrapper com promises. Compilado com seu App ID + Client Token do Facebook (etapa Integrar); sem eles, toda chamada responde not_configured.

Retorna: facebookLogin(permissionsCsv, callbackId) resolve window.__appmintReplies[callbackId]; com um callbackId vazio a resposta chega como o evento appmint:facebook-login. getFacebookAccessToken() retorna o JSON do token ou "". facebookLogEvent(name, valueToSum, paramsJson) retorna {ok, name, dropped} como texto JSON (valueToSum é um número como texto, ou ""). Requer: Facebook Login ativado na compilação.

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();

Oculte o botão quando o login do Facebook não estiver configurado nesta compilação:

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', '');
});

Registre um evento de compra e saia:

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();
});

Observações: Implementado em FacebookBridge.kt sem nenhum SDK do Facebook: o login é o fluxo web manual do Facebook em uma aba do navegador, e os App Events vão para a Graph API de App Events do Facebook.

facebookLogout ponte#

window.WebToApk.facebookLogout()

Desconecta o usuário do Facebook deste app (limpa o token de acesso em cache).

Exemplo

Documentado junto com WebToApk.facebookLogin - o exemplo de lá mostra este também.

Os métodos brutos por trás de AppMint.facebook - prefira o wrapper com promises. Compilado com seu App ID + Client Token do Facebook (etapa Integrar); sem eles, toda chamada responde not_configured.

Retorna: facebookLogin(permissionsCsv, callbackId) resolve window.__appmintReplies[callbackId]; com um callbackId vazio a resposta chega como o evento appmint:facebook-login. getFacebookAccessToken() retorna o JSON do token ou "". facebookLogEvent(name, valueToSum, paramsJson) retorna {ok, name, dropped} como texto JSON (valueToSum é um número como texto, ou ""). Requer: Facebook Login ativado na compilação.

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();

Oculte o botão quando o login do Facebook não estiver configurado nesta compilação:

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', '');
});

Registre um evento de compra e saia:

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();
});

Observações: Implementado em FacebookBridge.kt sem nenhum SDK do Facebook: o login é o fluxo web manual do Facebook em uma aba do navegador, e os App Events vão para a Graph API de App Events do Facebook.

getFacebookAccessToken ponte#

window.WebToApk.getFacebookAccessToken(): String

O token de acesso atual do Facebook como JSON {accessToken, userId, expires, grantedPermissions, declinedPermissions}, ou "" quando não há login.

Exemplo

Documentado junto com WebToApk.facebookLogin - o exemplo de lá mostra este também.

Os métodos brutos por trás de AppMint.facebook - prefira o wrapper com promises. Compilado com seu App ID + Client Token do Facebook (etapa Integrar); sem eles, toda chamada responde not_configured.

Retorna: facebookLogin(permissionsCsv, callbackId) resolve window.__appmintReplies[callbackId]; com um callbackId vazio a resposta chega como o evento appmint:facebook-login. getFacebookAccessToken() retorna o JSON do token ou "". facebookLogEvent(name, valueToSum, paramsJson) retorna {ok, name, dropped} como texto JSON (valueToSum é um número como texto, ou ""). Requer: Facebook Login ativado na compilação.

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();

Oculte o botão quando o login do Facebook não estiver configurado nesta compilação:

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', '');
});

Registre um evento de compra e saia:

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();
});

Observações: Implementado em FacebookBridge.kt sem nenhum SDK do Facebook: o login é o fluxo web manual do Facebook em uma aba do navegador, e os App Events vão para a Graph API de App Events do Facebook.

Gerado a partir do runtime do app e de seus arquivos de exemplo a cada build da documentação. Leia em Markdown · Todas as famílias.

Conferido com a ponte atual em 22/10/2026.