Создать APK бесплатно

JavaScript bridge API

Facebook, события Meta и Firebase Analytics

Facebook Login, Meta App Events и Firebase Analytics с вашими собственными ключами, заданными при сборке. Аналитика ничего не собирает, пока пользователь не дал согласие.

AppMint.analytics помощник#

AppMint.analytics — one event to Firebase and Meta

Пример

Записывает событие в каждый сервис аналитики, подключённый при сборке: Firebase Analytics (ваш google-services.json) и Meta App Events. Имена очищаются по правилам каждого сервиса, а в ответе указано, что отправлено.

Возвращает: log(name, params) → {ok, providers: {firebase?, meta?}}, каждый {ok, name, dropped} или {ok: false, error}. setUserId(id), setUserProperty(name, value), screenView(name, class), setEnabled(on) → Promise; providers() → {firebase, meta}. Требуется: шаг «Интеграция» → Firebase Analytics (загрузите google-services.json в карточке Push) и/или 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);

Вход и выход синхронизируют идентификатор пользователя:

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

Проверьте, какие сервисы подключены, прежде чем на них полагаться:

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

Примечания: Согласие: когда приложение показывает рекламу, форма согласия Google решает и вопрос аналитики — ничего не собирается, пока нет ответа, а там, где действует GDPR, должна быть разрешена цель 1; собственный setEnabled(false) страницы всегда главнее. Пока сбор выключен, вызовы отвечают no_consent (ничего не ставится в очередь). Имена Firebase: буквы, цифры и _, до 40 символов, не более 25 параметров, строковые значения до 100 символов; зарезервированные имена (first_open, session_start, firebase_…, google_…, ga_…) отвечают reserved_name / reserved_prefix. params.value (число) становится value-to-sum в Meta. Если включено Log a screen view for every page change, смена маршрута автоматически записывает screen_view. Ошибки: not_configured, missing_google_app_id, params_not_json, invalid_name.

AppMint.facebook помощник#

AppMint.facebook — Facebook Login and Meta App Events

Пример

«Продолжить через Facebook» на ВАШЕМ собственном приложении Facebook. Вход открывает Facebook во вкладке браузера (Custom Tab): используется вход facebook.com в этом браузере, а НЕ приложение Facebook, и приложение возвращается, когда пользователь подтверждает. Также записывает Meta App Events, если вы их включили.

Возвращает: login(permissions) → Promise, который всегда выполняется: {ok: true, accessToken, userId, expires, grantedPermissions, declinedPermissions} или {ok: false, cancelled?, error}. getAccessToken() → тот же объект токена или null, если вход не выполнен. logEvent(name, valueToSum, params) → {ok, name, dropped} (ставится в очередь и отправляется пакетами) или {ok: false, error}. Требуется: шаг сборки «Интеграция» → Facebook Login с вашими Facebook App ID и Client Token (и Meta App Events для logEvent).

Войдите, затем используйте токен с вашим бэкендом:

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

Показывайте кнопку Facebook только внутри приложения и обрабатывайте отсутствие настройки:

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

Примечания: Facebook Developers → ваше приложение → Facebook Login → Settings → Valid OAuth Redirect URIs: добавьте https://freewebtoapk.com/fb-return/ (в мастере есть кнопка «Копировать»). Ни ключ-хэш, ни настройка платформы Android не нужны. Токен проверяется на стороне Facebook (он должен принадлежать вашему App ID), прежде чем promise выполнится. Если Android закрыл приложение, пока пользователь был в браузере, результат не доставляется в promise — токен сохраняется, и getAccessToken() возвращает его при запуске страницы. Ошибки: not_configured, busy (вход уже открыт), cancelled (также когда пользователь закрывает вкладку), state_mismatch, wrong_app, failed, no_token, foreign_origin (страница, не принадлежащая приложению). App Events (отправляются из приложения в App Events API Facebook с вашим клиентским токеном) начинаются только после согласия (см. AppMint.analytics) и до тех пор отвечают no_consent. Вход через веб с перенаправлениями Supabase или Firebase работает как прежде.

analyticsLogEvent мост#

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

Событие Firebase; имя очищается по правилам Firebase. Возвращает {ok, name, dropped} или {ok:false, error}.

Пример

Прямые методы Firebase Analytics, на которых основан AppMint.analytics, — предпочитайте обёртку. Каждый возвращает ответ в виде текста JSON: {ok, name, dropped} или {ok: false, error}.

Возвращает: текст JSON (analyticsSetEnabled ничего не возвращает). Требуется: шаг «Интеграция» → Firebase Analytics, с загруженным google-services.json в карточке Push Notifications.

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

Определите наличие функции, затем запишите покупку и просмотр экрана:

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

Обработайте отклонённое событие и переключатель согласия:

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

Примечания: analyticsSetEnabled — переключатель согласия страницы сразу для Firebase и Meta App Events; правила согласия см. в AppMint.analytics.

analyticsLogScreenView мост#

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

screen_view Firebase для [screenName] (например, путь маршрута).

Пример

Описано вместе с WebToApk.analyticsLogEvent — пример там показывает и этот.

Прямые методы Firebase Analytics, на которых основан AppMint.analytics, — предпочитайте обёртку. Каждый возвращает ответ в виде текста JSON: {ok, name, dropped} или {ok: false, error}.

Возвращает: текст JSON (analyticsSetEnabled ничего не возвращает). Требуется: шаг «Интеграция» → Firebase Analytics, с загруженным google-services.json в карточке Push Notifications.

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

Определите наличие функции, затем запишите покупку и просмотр экрана:

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

Обработайте отклонённое событие и переключатель согласия:

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

Примечания: analyticsSetEnabled — переключатель согласия страницы сразу для Firebase и Meta App Events; правила согласия см. в AppMint.analytics.

analyticsSetEnabled мост#

window.WebToApk.analyticsSetEnabled(enabled: Boolean)

Собственный переключатель аналитики страницы для всех провайдеров; сохраняется.

Пример

Описано вместе с WebToApk.analyticsLogEvent — пример там показывает и этот.

Прямые методы Firebase Analytics, на которых основан AppMint.analytics, — предпочитайте обёртку. Каждый возвращает ответ в виде текста JSON: {ok, name, dropped} или {ok: false, error}.

Возвращает: текст JSON (analyticsSetEnabled ничего не возвращает). Требуется: шаг «Интеграция» → Firebase Analytics, с загруженным google-services.json в карточке Push Notifications.

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

Определите наличие функции, затем запишите покупку и просмотр экрана:

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

Обработайте отклонённое событие и переключатель согласия:

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

Примечания: analyticsSetEnabled — переключатель согласия страницы сразу для Firebase и Meta App Events; правила согласия см. в AppMint.analytics.

analyticsSetUserId мост#

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

Идентификатор пользователя Firebase («» очищает его).

Пример

Описано вместе с WebToApk.analyticsLogEvent — пример там показывает и этот.

Прямые методы Firebase Analytics, на которых основан AppMint.analytics, — предпочитайте обёртку. Каждый возвращает ответ в виде текста JSON: {ok, name, dropped} или {ok: false, error}.

Возвращает: текст JSON (analyticsSetEnabled ничего не возвращает). Требуется: шаг «Интеграция» → Firebase Analytics, с загруженным google-services.json в карточке Push Notifications.

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

Определите наличие функции, затем запишите покупку и просмотр экрана:

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

Обработайте отклонённое событие и переключатель согласия:

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

Примечания: analyticsSetEnabled — переключатель согласия страницы сразу для Firebase и Meta App Events; правила согласия см. в AppMint.analytics.

analyticsSetUserProperty мост#

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

Пользовательское свойство Firebase (имя до 24 символов, значение до 36; «» очищает его).

Пример

Описано вместе с WebToApk.analyticsLogEvent — пример там показывает и этот.

Прямые методы Firebase Analytics, на которых основан AppMint.analytics, — предпочитайте обёртку. Каждый возвращает ответ в виде текста JSON: {ok, name, dropped} или {ok: false, error}.

Возвращает: текст JSON (analyticsSetEnabled ничего не возвращает). Требуется: шаг «Интеграция» → Firebase Analytics, с загруженным google-services.json в карточке Push Notifications.

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

Определите наличие функции, затем запишите покупку и просмотр экрана:

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

Обработайте отклонённое событие и переключатель согласия:

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

Примечания: analyticsSetEnabled — переключатель согласия страницы сразу для Firebase и Meta App Events; правила согласия см. в AppMint.analytics.

facebookLogEvent мост#

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

Событие Meta App; [valueToSum] — число в виде текста или «»; [paramsJson] — плоский объект JSON. Возвращает {ok, name, dropped} или {ok:false, error}.

Пример

Описано вместе с WebToApk.facebookLogin — пример там показывает и этот.

Прямые методы, на которых основан AppMint.facebook, — предпочитайте обёртку с promise. Собираются с вашими Facebook App ID + Client Token (шаг «Интеграция»); без них каждый вызов отвечает not_configured.

Возвращает: facebookLogin(permissionsCsv, callbackId) выполняет window.__appmintReplies[callbackId]; при пустом callbackId ответ приходит событием appmint:facebook-login. getFacebookAccessToken() возвращает JSON токена или "". facebookLogEvent(name, valueToSum, paramsJson) возвращает {ok, name, dropped} в виде текста JSON (valueToSum — число в виде текста или ""). Требуется: включённый в сборке Facebook Login.

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

Скройте кнопку, если вход через Facebook не настроен в этой сборке:

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

Запишите событие покупки и выйдите:

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

Примечания: Реализовано в FacebookBridge.kt без какого-либо SDK Facebook: вход — это ручной веб-процесс Facebook во вкладке браузера, App Events отправляются в Graph API App Events Facebook.

facebookLogin мост#

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

Нативный вход через Facebook; [permissionsCsv], например «public_profile,email». Передаёт результат в [callbackId] или вызывает `appmint:facebook-login`, когда он пуст.

Пример

Прямые методы, на которых основан AppMint.facebook, — предпочитайте обёртку с promise. Собираются с вашими Facebook App ID + Client Token (шаг «Интеграция»); без них каждый вызов отвечает not_configured.

Возвращает: facebookLogin(permissionsCsv, callbackId) выполняет window.__appmintReplies[callbackId]; при пустом callbackId ответ приходит событием appmint:facebook-login. getFacebookAccessToken() возвращает JSON токена или "". facebookLogEvent(name, valueToSum, paramsJson) возвращает {ok, name, dropped} в виде текста JSON (valueToSum — число в виде текста или ""). Требуется: включённый в сборке Facebook Login.

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

Скройте кнопку, если вход через Facebook не настроен в этой сборке:

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

Запишите событие покупки и выйдите:

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

Примечания: Реализовано в FacebookBridge.kt без какого-либо SDK Facebook: вход — это ручной веб-процесс Facebook во вкладке браузера, App Events отправляются в Graph API App Events Facebook.

facebookLogout мост#

window.WebToApk.facebookLogout()

Выводит пользователя Facebook из этого приложения (очищает кэшированный токен доступа).

Пример

Описано вместе с WebToApk.facebookLogin — пример там показывает и этот.

Прямые методы, на которых основан AppMint.facebook, — предпочитайте обёртку с promise. Собираются с вашими Facebook App ID + Client Token (шаг «Интеграция»); без них каждый вызов отвечает not_configured.

Возвращает: facebookLogin(permissionsCsv, callbackId) выполняет window.__appmintReplies[callbackId]; при пустом callbackId ответ приходит событием appmint:facebook-login. getFacebookAccessToken() возвращает JSON токена или "". facebookLogEvent(name, valueToSum, paramsJson) возвращает {ok, name, dropped} в виде текста JSON (valueToSum — число в виде текста или ""). Требуется: включённый в сборке Facebook Login.

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

Скройте кнопку, если вход через Facebook не настроен в этой сборке:

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

Запишите событие покупки и выйдите:

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

Примечания: Реализовано в FacebookBridge.kt без какого-либо SDK Facebook: вход — это ручной веб-процесс Facebook во вкладке браузера, App Events отправляются в Graph API App Events Facebook.

getFacebookAccessToken мост#

window.WebToApk.getFacebookAccessToken(): String

Текущий токен доступа Facebook в виде JSON {accessToken, userId, expires, grantedPermissions, declinedPermissions} или «», если вход не выполнен.

Пример

Описано вместе с WebToApk.facebookLogin — пример там показывает и этот.

Прямые методы, на которых основан AppMint.facebook, — предпочитайте обёртку с promise. Собираются с вашими Facebook App ID + Client Token (шаг «Интеграция»); без них каждый вызов отвечает not_configured.

Возвращает: facebookLogin(permissionsCsv, callbackId) выполняет window.__appmintReplies[callbackId]; при пустом callbackId ответ приходит событием appmint:facebook-login. getFacebookAccessToken() возвращает JSON токена или "". facebookLogEvent(name, valueToSum, paramsJson) возвращает {ok, name, dropped} в виде текста JSON (valueToSum — число в виде текста или ""). Требуется: включённый в сборке Facebook Login.

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

Скройте кнопку, если вход через Facebook не настроен в этой сборке:

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

Запишите событие покупки и выйдите:

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

Примечания: Реализовано в FacebookBridge.kt без какого-либо SDK Facebook: вход — это ручной веб-процесс Facebook во вкладке браузера, App Events отправляются в Graph API App Events Facebook.