أنشئ APK مجانًا

واجهة JavaScript bridge API

Facebook وأحداث Meta وFirebase Analytics

Facebook Login وMeta App Events وFirebase Analytics بمفاتيح المنشئ نفسه، تُضبط عند الإنشاء. لا تجمع التحليلات أي شيء حتى يوافق المستخدم.

AppMint.analytics دالة مساعدة (helper)#

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) ← Promises؛ providers() ← {firebase, meta}. المتطلبات: خطوة Integrate ← 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 (رقم) يصبح قيمة Meta للجمع. مع تفعيل تسجيل عرض شاشة عند كل تغيير صفحة، تسجّل تغييرات المسار screen_view تلقائيًا. الأخطاء: not_configured, missing_google_app_id, params_not_json, invalid_name.

AppMint.facebook دالة مساعدة (helper)#

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}. المتطلبات: خطوة Integrate في الإنشاء ← 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/ (في المعالج زر نسخ). لا حاجة لمفتاح hash أو إعداد منصة 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 الجسر (bridge)#

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 لا يُرجع شيئًا). المتطلبات: خطوة Integrate ← Firebase Analytics، مع رفع google-services.json في بطاقة الإشعارات الفورية.

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 الجسر (bridge)#

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 لا يُرجع شيئًا). المتطلبات: خطوة Integrate ← Firebase Analytics، مع رفع google-services.json في بطاقة الإشعارات الفورية.

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 الجسر (bridge)#

window.WebToApk.analyticsSetEnabled(enabled: Boolean)

مفتاح التحليلات الخاص بالصفحة لكل المزوّدين؛ محفوظ.

مثال

موثَّق مع WebToApk.analyticsLogEvent - والمثال هناك يعرض هذا أيضًا.

دوال Firebase Analytics الخام خلف AppMint.analytics - فضّل الغلاف. كل منها يُرجع إجابته كنص JSON: {ok, name, dropped} أو {ok: false, error}.

يُرجع: نص JSON (analyticsSetEnabled لا يُرجع شيئًا). المتطلبات: خطوة Integrate ← Firebase Analytics، مع رفع google-services.json في بطاقة الإشعارات الفورية.

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 الجسر (bridge)#

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

معرّف مستخدم Firebase ("" تمسحه).

مثال

موثَّق مع WebToApk.analyticsLogEvent - والمثال هناك يعرض هذا أيضًا.

دوال Firebase Analytics الخام خلف AppMint.analytics - فضّل الغلاف. كل منها يُرجع إجابته كنص JSON: {ok, name, dropped} أو {ok: false, error}.

يُرجع: نص JSON (analyticsSetEnabled لا يُرجع شيئًا). المتطلبات: خطوة Integrate ← Firebase Analytics، مع رفع google-services.json في بطاقة الإشعارات الفورية.

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 الجسر (bridge)#

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 لا يُرجع شيئًا). المتطلبات: خطوة Integrate ← Firebase Analytics، مع رفع google-services.json في بطاقة الإشعارات الفورية.

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 الجسر (bridge)#

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 الخاصين بك (خطوة Integrate)؛ وبدونهما يُجيب كل استدعاء 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 دون أي Facebook SDK: تسجيل الدخول هو مسار الويب اليدوي من Facebook في تبويب متصفح، وأحداث التطبيق تذهب إلى Graph API لأحداث تطبيق Facebook.

facebookLogin الجسر (bridge)#

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

تسجيل دخول Facebook الأصلي؛ [permissionsCsv] مثل "public_profile,email". يحسم [callbackId]، أو يُطلق `appmint:facebook-login` عندما يكون فارغًا.

مثال

الدوال الخام خلف AppMint.facebook - فضّل غلاف promise. تُبنى بـ Facebook App ID وClient Token الخاصين بك (خطوة Integrate)؛ وبدونهما يُجيب كل استدعاء 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 دون أي Facebook SDK: تسجيل الدخول هو مسار الويب اليدوي من Facebook في تبويب متصفح، وأحداث التطبيق تذهب إلى Graph API لأحداث تطبيق Facebook.

facebookLogout الجسر (bridge)#

window.WebToApk.facebookLogout()

يسجّل خروج مستخدم Facebook من هذا التطبيق (يمسح رمز الوصول المخزّن).

مثال

موثَّق مع WebToApk.facebookLogin - والمثال هناك يعرض هذا أيضًا.

الدوال الخام خلف AppMint.facebook - فضّل غلاف promise. تُبنى بـ Facebook App ID وClient Token الخاصين بك (خطوة Integrate)؛ وبدونهما يُجيب كل استدعاء 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 دون أي Facebook SDK: تسجيل الدخول هو مسار الويب اليدوي من Facebook في تبويب متصفح، وأحداث التطبيق تذهب إلى Graph API لأحداث تطبيق Facebook.

getFacebookAccessToken الجسر (bridge)#

window.WebToApk.getFacebookAccessToken(): String

رمز وصول Facebook الحالي بصيغة JSON {accessToken, userId, expires, grantedPermissions, declinedPermissions}، أو "" عند تسجيل الخروج.

مثال

موثَّق مع WebToApk.facebookLogin - والمثال هناك يعرض هذا أيضًا.

الدوال الخام خلف AppMint.facebook - فضّل غلاف promise. تُبنى بـ Facebook App ID وClient Token الخاصين بك (خطوة Integrate)؛ وبدونهما يُجيب كل استدعاء 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 دون أي Facebook SDK: تسجيل الدخول هو مسار الويب اليدوي من Facebook في تبويب متصفح، وأحداث التطبيق تذهب إلى Graph API لأحداث تطبيق Facebook.

يتم إنشاؤه من بيئة تشغيل التطبيق وملفات الأمثلة الخاصة به عند كل بناء للمستندات. اقرأه بصيغة Markdown · جميع العائلات.

تمت المراجعة مقابل الجسر المُرفق بتاريخ 2026-10-22.