الإشعارات
AppMint Push - أرسل إشعارات إلى مستخدميك
أرسل إشعارات إلى كل من ثبّت تطبيقك، مباشرة من AppMint وعلى مشروع Firebase الخاص بك - جدولة وتعديل بعد الإرسال وإلغاء وروابط عميقة
1كيف يعمل#
يرسل AppMint Push إشعارات إلى كل من ثبّت تطبيقك، من داخل AppMint - إرسال فوري وجدولة وتعديل بعد الإرسال وإلغاء وروابط عميقة.
يمكن تصميم كل رسالة: 8 قوالب ولونك الخاص وحتى 3 أزرار يفتح كل منها صفحته وخيارات الصوت والظهور المنبثق ولافتة أو بطاقة أو لوحة سفلية أو ملء شاشة أصلية داخل التطبيق أثناء فتحه. تعرضها معاينة حية تمامًا كما ستظهر على هواتف المستخدمين.
يعمل على مشروع Firebase الخاص بك: مستخدموك ومشروعك، دون حدود مشتركة، ولا شيء من ملفاتك مستضاف لدى AppMint. Firebase Cloud Messaging مجاني وبلا حد للرسائل.
تحتاج ملفين من ذلك المشروع - google-services.json (للبناء) ومفتاح حساب خدمة (للإرسال). الخطوات التالية تجلب الاثنين. يعمل مع كل أوضاع البناء: الموقع وZIP وHTML والذكاء الاصطناعي.
AppMint Push وOneSignal بديلان: تفعيل أحدهما يوقف الآخر.
2أنشئ مشروع Firebase#
انتقل إلى Firebase Console وانقر 'Add project' (أو افتح مشروعًا لديك). يكفي مشروع Firebase مجاني - لا حاجة لفوترة للإشعارات.
يمكن لمشروع واحد أن يضم عدة تطبيقات لك.
3أضف تطبيقك ونزّل google-services.json#
في مشروع Firebase الخاص بك:
- انقر 'Add app' واختر Android
- أدخل اسم الحزمة (package name) تمامًا كما ضُبط في معالج AppMint (مثل com.yourname.yourapp) - أي اختلاف يعني أن الإشعارات لن تصل أبدًا، ويرفض AppMint البناء بسببه
- انقر 'Register app' ونزّل google-services.json
- يمكنك تخطي بقية خطوات SDK - يتولاها AppMint
4فعّله وارفع الملف#
في بطاقة Push Notifications في معالج البناء:
- فعّل 'AppMint Push'
- انقر 'Upload google-services.json' واختر الملف من الخطوة السابقة
يفحص المعالج أن الملف يحتوي اسم حزمتك. ثم ابنِ APK كالمعتاد - أثناء البناء يُسجَّل تطبيقك للـ push على مشروعك.
يثبّت المستخدمون التطبيق ويفتحونه مرة واحدة فقط. على Android 13+ يُطلب منهم السماح بالإشعارات بعد تحميل الشاشة الأولى.
القوالب والأزرار وأنماط العرض داخل التطبيق تحتاج تطبيقًا مبنيًا بهذا الإصدار من AppMint أو أحدث. البناء الأقدم يستلم كل رسالة - ويعرضها بالنمط البسيط الذي اعتاده.
5ارفع مفتاح حساب الخدمة (مرة واحدة)#
يرسل AppMint عبر مشروعك، لذا يحتاج مفتاحًا منه - وهو الملف نفسه الذي يطلبه OneSignal.
في Firebase Console:
- ⚙ Project settings ← تبويب 'Service accounts'
- انقر 'Generate new private key' وأكّد - يُنزَّل ملف JSON
في AppMint: Home > Notifications ← اختر تطبيقك ← 'Upload key' ← اختر ملف JSON ذاك.
يتحقق AppMint من المفتاح بإرسال تجريبي إلى مشروعك قبل تخزينه (مشفّرًا)، فالعلامة الخضراء تعني أن الإرسال التالي سيخرج فعلًا. رفع واحد لكل تطبيق؛ وإعادة بناء التطبيق لا تحتاجه مجددًا ما لم تبدّل مشاريع Firebase.
⚠️ ارفع هنا مفتاح حساب الخدمة (service-account)، لا google-services.json - تخبرك الشاشة إن خلطت بينهما. لسحب الصلاحية لاحقًا، احذف المفتاح في Firebase Console.
6أرسل أول إشعار لك#
في Home > Notifications:
- اختر تطبيقك
- اكتب عنوانًا (الرسالة والصورة والرابط اختيارية)
- راجع بطاقة المعاينة الحية
- انقر 'Send Notification'
كل هاتف مثبّت عليه تطبيقك يتلقاها.
للصورة، انقر مربع Image: 'Choose from device' (حتى 2 ميغابايت، PNG أو JPEG أو WebP) أو 'Paste an image link' (https://). الصورة المختارة تُرفع فقط عند الضغط على Send - يمكنك اختيارها أو استبدالها أو إزالتها قدر ما تشاء قبل ذلك.
7اختر قالبًا#
Design ← Template يحدد تخطيط الإشعار. النص يأتي أولًا دائمًا - فالصورة لا تغطي الرسالة أبدًا:
- تلقائي - بطاقة صورة عندما تحتوي الرسالة على صورة، وإلا قياسي
- قياسي - العنوان والرسالة كاملة؛ وتصبح الصورة صورة مصغرة بجانبها
- بطاقة صورة - الصورة أسفل العنوان والرسالة المقروءين
- لافتة - بطاقة مملوءة بلونك، مع شارة اختيارية
- ترويجي - شارة مثل '50% OFF' وزر ملون (زرك الأول)
- قائمة - حتى 6 أسطر قصيرة، مثل عدة تحديثات لطلب
- عدّ تنازلي - مؤقت حي يعد تنازليًا إلى تاريخ ووقت تختارهما، ثم يغادر شريط الإشعارات من تلقاء نفسه
- التقدم - شريط تقدم؛ عدّل وأعد الإرسال بقيمة جديدة فيتحرك الشريط على كل هاتف دون اهتزاز جديد
- أدنى - عنوان وسطر واحد، دون صوت ودون ظهور منبثق
تتكيف أحجام النص والصور مع حجم خط كل مستخدم، فلا يُقطع شيء على الهواتف ذات النص الكبير.
8اختر لونًا#
Design ← Colour يلوّن أيقونة الإشعار ولافتته وأزراره وعدّه التنازلي. اختر أحد 9 ألوان جاهزة، أو '+' لأي #RRGGBB.
كل لون جاهز يُقرأ جيدًا على الهواتف الفاتحة والداكنة. اللون المخصص يُفحص مقابل الاثنين: إن كان باهتًا أو داكنًا جدًا، تذكر الملاحظة تحت الألوان ذلك، و'Fix contrast' في مربع اللون المخصص يقرّبه إلى أقرب درجة تعمل مع الحفاظ على صبغته. ويُكتب النص على زر أو لافتة ملونة بالأسود أو الأبيض تلقائيًا.
استخدم مربعي 'Light phone' / 'Dark phone' في المعاينة الحية لرؤية الحالتين.
9أضف أزرارًا#
Design ← Buttons: '+ Add button' (حتى 3). لكل زر تسمية (حتى 24 حرفًا) ورابطه الخاص - مثل 'Track order' ← #/orders/1042 و'Help' ← #/support. اترك رابط الزر فارغًا ليفتح الرابط الرئيسي.
تظهر الأزرار تحت الإشعار في الشريط وفي العرض داخل التطبيق. في قالب Promo يصبح الزر الأول الزر الملون الكبير على البطاقة.
10أثناء فتح التطبيق#
Design ← 'While the app is open' يحدد ما يراه المستخدم عندما تصل الرسالة أثناء استخدامه تطبيقك:
- تصميم التطبيق نفسه (الافتراضي) - يعرضه كود تطبيقك (راجع In-App Inbox أدناه)
- لافتة علوية - تنزلق من الأعلى وتختفي من تلقاء نفسها بعد ثوانٍ
- بطاقة مركزية - بطاقة فوق التطبيق المعتّم بالصورة والنص والأزرار
- لوحة سفلية - البطاقة نفسها ترتفع من الأسفل
- ملء الشاشة - صورة كبيرة مع الأزرار في الأسفل
يتبع العرض سمة الهاتف الفاتحة أو الداكنة، ويغلقه زر الرجوع أو النقر خارجه. وعندما يُعرض، لا توضع الرسالة نفسها في شريط الإشعارات أيضًا - فالمستخدم يشاهدها بالفعل.
مع 'In-app only' (Delivery ← Show as)، الرسالة التي تصل والتطبيق مغلق تُعرض عند فتح المستخدم له في المرة التالية.
11الصوت والظهور المنبثق والتوقيت#
Design ← Behaviour:
- الصوت - أوقفه لإشعار صامت
- الظهور المنبثق على الشاشة - أوقفه لتجنب الظهور فوق ما يفعله المستخدم (ويصل مع ذلك إلى شريط الإشعارات)
- إغلاق تلقائي - يزيل الإشعار من الشريط بعد 30 ثانية حتى 3 أيام (Android 8 وأحدث)
خيارات متقدمة:
- صورة أيقونة / صورة شخصية - صورة دائرية بجانب النص (رابط https://)
- مفتاح التجميع - الرسائل التي تتشاركه تُجمَّع تحت عنوان واحد
- مفتاح الاستبدال - رسالة أحدث بالمفتاح نفسه تستبدل الأقدم على الهاتف وفي صندوق الوارد، مثل نتيجة مباراة مباشرة
يستطيع المستخدمون أيضًا ضبط الصوت لكل نوع في إعدادات إشعارات Android لتطبيقك.
صوتك الخاص: في الخطوات، Integrate ← Push Notifications ← Notification sound (MP3 أو OGG أو WAV أو M4A أو AAC أو FLAC أو Opus، حتى 1 ميغابايت و30 ثانية). يُشغَّل لكل رسالة مرسلة مع تفعيل Sound. تحصل التطبيقات المثبتة عليه مع التحديث الذي يحمله؛ ويظل بإمكان كل مستخدم تغييره في إعدادات إشعارات Android.
12اختبر واحفظ وأعد الاستخدام#
- المعاينة الحية - مربعات Collapsed وExpanded وIn-app، على هاتف فاتح أو داكن، مرسومة بالكود نفسه الذي تشغّله هواتف مستخدميك
- 'Test on this phone' - يعرض الرسالة على هاتفك أنت فقط، كإشعار حقيقي أو كعرض داخل التطبيق فوق شاشة Notifications. لا يُرسل شيء إلى المستخدمين
- القوالب المحفوظة (أيقونة الكتاب في الأعلى) - 'Save the current message as a template' يحفظ النص والرابط والصورة وكل خيار تصميم على هذا الهاتف؛ و'Use' يعيده بنقرة واحدة
- في History، 'Duplicate as a new message' يبدأ رسالة جديدة من أي رسالة سابقة
13جدولة لوقت لاحق#
في بطاقة Delivery، انقر على 'Schedule' تحت When، ثم اختر تاريخًا ووقتًا. يُرسل الإشعار تلقائيًا في تلك اللحظة.
حتى موعد إرساله، يمكنك تعديله أو إلغاؤه من قائمة History أدناه.
14تصحيح خطأ بعد الإرسال#
انقر على أي إشعار في History:
- 'Edit & resend' - يعيده إلى محرر الإنشاء بتصميمه كاملًا؛ ثم 'Update & resend' يستبدله في مكانه على كل جهاز
- 'Cancel' - يزيله من كل هاتف لم يفتحه بعد، بما في ذلك عرض داخل التطبيق ما زال على الشاشة
- 'Delete' - مثل الإلغاء، ويمسحه من سجلك
⚠️ الإشعار الذي فتحه المستخدم أو أغلقه لا يمكن استرجاعه.
15افتح صفحة محددة#
حقل Link الاختياري يتحكم فيما يفتحه النقر (ويمكن لكل زر رابطه الخاص):
- عنوان https:// كامل (ممتاز لتطبيقات المواقع)
- مسار داخل التطبيق مثل #/offers
يمكن لكود تطبيقك أيضًا قراءته في أي وقت:
const link = window.WebToApk?.getLaunchUrl?.();
window.addEventListener('appmint:deep-link',
e => goTo(e.detail.url));16صندوق الوارد داخل التطبيق (اختياري)#
كل push يُخزَّن أيضًا داخل التطبيق المثبّت (آخر 50)، فيستطيع تطبيقك عرض شاشة إشعارات خاصة به مع شارات غير المقروء. يعمل هذا في كل أوضاع البناء - بما فيها تطبيقات الموقع (URL)، حيث تضيف هذه الأسطر القليلة إلى موقعك.
عندما يكون الغلاف قد عرض رسالة على الشاشة (نمطًا تحت 'While the app is open')، يقول الحدث presented: true - فلا ترسم لافتة ثانية حينها. والتطبيق الذي يرسم كل لافتاته بنفسه يستطيع إيقاف لافتات الغلاف بـ setPushPresentation('none').
الإغلاق يكون بالسحب لا بـ ✕ صغيرة، ويمكن التراجع عنه - اقرنه بزر تراجع قصير:
const B = window.WebToApk;
const inbox = JSON.parse(B?.getPushInbox?.() ?? "[]");
// [{id,title,body,imageUrl,link,receivedAt,read,
// template?,accent?,buttons?,badge?,inapp?...}]
const unread = inbox.filter(m => !m.read).length;
// live arrival while the app is open
window.addEventListener('appmint:push', e => {
const d = e.detail;
if (d.type === 'received' && !d.presented) showBanner(d.message);
refreshInbox(); // fires for 'revoked' too
});
B?.markPushRead?.(id); // "" = mark all read
B?.dismissPushMessage?.(id); // swipe away
B?.restorePushMessage?.(id); // ...Undo
B?.setPushPresentation?.('none'); // app draws its own17إن لم يصل شيء إلى هاتف الاختبار#
في الغالب هو حد في هاتف الاختبار، لا في تطبيقك ولا في مستخدميك.
يسمح Android بنحو 100 تسجيل push لكل هاتف. كل تثبيت جديد لتطبيق يستخدم الإشعارات يأخذ واحدًا - لذا تثبيت بناء بعد بناء أثناء الاختبار قد يستنفدها كلها، ثم يتوقف ذلك الهاتف عن الاستلام للتطبيقات المثبتة حديثًا.
حرّر الخانات (هذا ما ينفع فعلًا):
- احذف تطبيقات الاختبار التي لم تعد بحاجة إليها - فيحرر Android الخانة التي كان كل منها يشغلها
- أو امسح بيانات تطبيق اختبار: Settings > Apps > [ذلك التطبيق] > Storage > Clear data - فيحرر خانته دون حذفه
- على المحاكي، مسحه يعيد ضبط كل الخانات دفعة واحدة
إعادة تشغيل الهاتف لا تفيد: هذه التسجيلات تُخزَّن بشكل دائم، ولهذا تبقى بعد إعادة التشغيل. ومسح ذاكرة التخزين المؤقت لخدمات Google Play لا يحررها أيضًا.
تجنب ذلك أثناء الاختبار:
- احتفظ باسم حزمة واحد أثناء التجريب - كل اسم حزمة مختلف يأخذ خانته الخاصة
- ثبّت APK الجديد فوق القديم بدل حذفه أولًا - التحديث يحتفظ بالتسجيل القائم، وإعادة التثبيت تستهلك تسجيلًا جديدًا
- اختبر على هاتف احتياطي أو محاكي؛ ومسح المحاكي يعيد ضبط خاناته فورًا
- احذف تطبيقات الاختبار التي انتهيت منها
افحص الأساسيات أيضًا: فُتح التطبيق مرة واحدة على الأقل بعد التثبيت، والإشعارات مسموحة له في إعدادات Android. يعيد التطبيق الاشتراك عند كل تشغيل، فيتعافى من تلقاء نفسه عندما تتحرر الخانات - دون حاجة لإعادة بناء.
18الحدود وأفضل الممارسات#
- لا حد لعدد الإشعارات التي ترسلها - Firebase Cloud Messaging مجاني
- العنوان حتى 120 حرفًا، والرسالة حتى 1000؛ وروابط الصورة والأيقونة يجب أن تبدأ بـ https://
- حتى 3 أزرار (تسميات بـ 24 حرفًا) وحتى 6 أسطر قائمة
- في الخطة المجانية يُعرض إعلان قصير قبل كل إرسال
- تطبيقات الاختبار: احذفها بأيقونة سلة المهملات بجانب محدد التطبيق - هذا يحذف السجل والمفتاح المخزَّن في AppMint فقط؛ ومشروع Firebase لا يُمسّ، وإعادة البناء تعيد إضافة التطبيق
- إعادة البناء بملف google-services.json جديد من المشروع نفسه لا تغيّر شيئًا: يبقى مفتاحك وتواصل التثبيتات القائمة الاستلام
- ⚠️ نقل التطبيق إلى مشروع Firebase مختلف قطيعة كاملة. أعد البناء بملف google-services.json الجديد، وارفع مفتاح المشروع الجديد (يُسقط AppMint القديم لأنه لا يستطيع الإرسال للمشروع الجديد) - واعلم أن الهواتف التي لا تزال تشغّل الإصدار القديم تتوقف عن الاستلام حتى يحدّث مستخدموها. الإشعارات تصل إلى مشروع، وتلك التثبيتات ما زالت تستمع للقديم
- أرسل بتحفظ: المستخدمون يحذفون التطبيقات التي تزعجهم
19اختر من يتلقاه#
تحت 'Who gets it'، تذهب الرسالة إلى Everyone (الافتراضي) أو إلى الهواتف التي تختارها:
- الدول واللغات وإصدارات Android وإصدارات التطبيق
- النشاط - فتح التطبيق خلال آخر N يومًا، أو لم يفتحه منذ N يومًا
- الهواتف التي تكون فيها الإشعارات مفعّلة فقط
- معرّفات المستخدمين والوسوم التي تضبطها صفحة تطبيقك (الخطوة التالية)
قبل الإرسال، تعرض الشاشة عدد الهواتف التي يصل إليها اختيارك.
طرق إرسال أخرى:
- التوقيت المحلي لكل هاتف (تحت When) - مثل 09:00 على ساعة كل هاتف، منطقة زمنية بعد أخرى
- اختبار A/B - اكتب نسخة B؛ تذهب كل نسخة إلى حصة اختبار من الجمهور، وبعد الانتظار الذي تحدده، تُرسل النسخة الأكثر فتحًا (أو نقرًا) إلى الباقين
- الحد اليومي لكل هاتف - أقصى عدد رسائل يتلقاها هاتف واحد من هذا التطبيق في اليوم؛ والرسائل الزائدة تُتخطى لذلك الهاتف وتظهر 'skipped (daily limit)'
يعرض History لكل رسالة عدد الهواتف التي وصلت إليها وكم فشل وكم تُخطي.
⚠️ اختيار الجمهور والتوقيت المحلي واختبارات A/B والأتمتة والحد اليومي لا تصل إلا إلى هواتف تشغّل تطبيقًا مبنيًا من 30 سبتمبر 2026 فصاعدًا (فهي تسجّل نفسها). الهواتف ذات البناءات الأقدم تستلم إرسالات 'Everyone' فقط - أعد البناء وانشر تحديثًا لتصل إليها بهذه الطريقة أيضًا.
20استهدف المستخدمين المسجَّلين والوسوم#
تخبر صفحة تطبيقك AppMint Push بمن سجّل الدخول وما يجب معرفته عن هذا التثبيت. ثم يمكنك الإرسال إلى مستخدم واحد، أو إلى كل من لديه وسم مثل plan = pro.
- setPushUser - بعد تسجيل الدخول، بمعرّف حسابك الخاص (معرّف قاعدة البيانات، لا بريدًا إلكترونيًا ولا رقم هاتف). أحرف وأرقام و_ @ . : + - (حتى 128). استدعِها بـ "" عند تسجيل الخروج، وإلا يظل الهاتف يتلقى رسائل ذلك المستخدم
- setPushTag / setPushTags - اسم وسم (أحرف وأرقام و_، حتى 32) وقيمة (حتى 128). "" يزيل وسمًا؛ وحتى 50 لكل تثبيت
- getPushUser / getPushTags - اقرأ ما يحتفظ به هذا الهاتف
المعرّفات والوسوم تخص التثبيت لا الحساب: امسح الوسوم الخاصة بالمستخدم عند تسجيل الخروج أيضًا. يبلّغ الهاتف عن التغيير بعد ثوانٍ (عند التشغيل التالي إن كان غير متصل). والمستخدم نفسه المسجَّل على هاتفين يُوصل إليه على الاثنين.
const B = window.WebToApk;
// after sign-in: your own account id
B?.setPushUser?.(user.id);
B?.setPushTag?.('plan', user.isPro ? 'pro' : 'free');
B?.setPushTags?.(JSON.stringify({ city: 'pune', level: '12' }));
// on sign-out
B?.setPushUser?.('');
B?.setPushTag?.('plan', '');
// read back
const who = B?.getPushUser?.() ?? '';
const tags = JSON.parse(B?.getPushTags?.() ?? '{}');21الأتمتة#
رسائل تُرسل من تلقاء نفسها. في Automations، انقر '+ New' واختر واحدة:
- ترحيب - بعد N دقيقة من تثبيت جديد (من 0 دقيقة إلى 30 يومًا). يتلقاه كل هاتف مرة واحدة
- استعادة المستخدم - عندما لا يفتح أحد التطبيق لمدة N يومًا (من 1 إلى 180). مرة واحدة لكل غياب: الهاتف الذي يعود ثم يغيب مجددًا يتلقاها مرة أخرى
- وسم - بعد N دقيقة من ضبط صفحة تطبيقك وسمًا، اختياريًا لقيمة واحدة فقط. لا يُرسل إلا إذا كان الوسم لا يزال مضبوطًا عند انتهاء الوقت
السلة المتروكة: اضبط وسمًا عند إضافة عناصر إلى السلة وأزله عند إتمام الشراء. ثم يذكّر أتمتة 'cart' بتأخير 60 دقيقة فقط من غادروا دون شراء. ضبط القيمة نفسها مجددًا لا يعيد تشغيل المؤقت؛ وبعد إزالة الوسم، قد يؤدي ضبطه مرة أخرى إلى إرسال آخر.
تُحتسب الأتمتة ضمن الحد اليومي لكل هاتف، وتصل إلى هواتف البناءات المصنوعة من 30 سبتمبر 2026 فصاعدًا.
const B = window.WebToApk;
// items added to the cart
B?.setPushTag?.('cart', 'open');
// checkout finished, or the cart emptied: no reminder
B?.setPushTag?.('cart', '');22الوصول إلى مستخدمين أوقفوا الإشعارات#
الهاتف الذي أُوقفت فيه الإشعارات لا يعرض إشعارًا في الشريط أبدًا - لكن رسالتك تصل إلى التطبيق مع ذلك، وتظهر رسالة داخل التطبيق عند فتحه في المرة التالية. استخدم ذلك لتطلب منهم تفعيل الإشعارات مجددًا:
- Who gets it ← Choose who ← فعّل 'Notifications off'
- Show as ← In-app only (لافتة علوية Top banner أو بطاقة مركزية Centre card تحت Design)
- Design ← Buttons ← '+ “Turn on notifications” button'. رابطه appmint://notifications/enable: النقر يعرض طلب الإذن، أو يفتح إعدادات الإشعارات في التطبيق عندما لا يمكن عرض الطلب بعد الآن
عندما يكون للتطبيق هواتف مُوقَفة الإشعارات، يعرض مركز الإرسال 'Reach the N phones with notifications off' تحت مفتاح Firebase - نقرة واحدة تضبط الثلاثة. وبمجرد تفعيل المستخدم للإشعارات، يغادر هاتفه ذلك الجمهور.
يحتاج الزر تطبيقًا مبنيًا بهذا الإصدار من AppMint أو أحدث؛ والبناءات الأقدم تعامل الرابط كرابط عادي. و appmint://notifications/settings يفتح شاشة الإعدادات مباشرة.
// Your page can offer the same thing itself:
const r = await window.AppMint?.enableNotifications?.();
// r = { state: 'granted' | 'prompt' | 'blocked' | 'unavailable',
// changed, openedSettings }
// and hear a push button's result too:
window.addEventListener('appmint:notifications', e => {
if (e.detail.state === 'granted') hideNotifBanner();
});23الرسائل داخل التطبيق#
الرسائل داخل التطبيق حملات تنشئها في مركز الإرسال: Push Notifications ← 'In-app messages' ← '+ New'. ينزّلها التطبيق ويعرضها بنفسه دون أي push، عندما يقع المُشغّل الذي اخترته:
- فتح التطبيق - الفتح رقم N
- صفحة أو مسار (/checkout أو #/cart أو /product/*)
- الوقت في التطبيق - N ثانية داخل التطبيق
- حدث تتتبعه صفحتك (الخطوة التالية)
- وسم push
- الإشعارات متوقفة - اقرنها بزر 'تفعيل الإشعارات'
- تحديث التطبيق - أول فتح بعد التحديث
اعرضها كلافتة أو نافذة أو لوحة سفلية أو ملء الشاشة. لكل رسالة تكرار (مرة لكل تثبيت افتراضيًا) وجمهور اختياري ووقت بدء وانتهاء اختياريان. تحتاج AppMint Push في البناء.
24أخبر التطبيق بما حدث#
دور صفحتك صغير: أبلغ عن اللحظات المهمة بـ trackEvent. الرسالة التي مُشغّلها 'When an event happens' بالاسم نفسه تظهر الآن (أو بعد الانتظار الذي اخترته). الأسماء: أحرف وأرقام و_ . : - (حتى 64). الأحداث لا تُحصى ولا تُخزَّن في أي مكان؛ هي فقط تقرر هل تظهر الرسالة.
تتبع رسائل المسار تغييرات العنوان الحقيقية (تحميل الصفحات وpushState ومسارات #hash) تلقائيًا. أما العرض الذي لا يظهره العنوان (تبويب أو خطوة معالج) فيمكن الإبلاغ عنه كمسار بالحدث appmint:route.
if (window.AppMint && AppMint.trackEvent) AppMint.trackEvent('checkout_done', { total: 42 });
// raw bridge: props as a JSON string ('' for none)
WebToApk.trackEvent('level:3', '');
// a view the address does not show, reported as a route
window.dispatchEvent(new CustomEvent('appmint:route', { detail: { path: '/cart' } }));25ارسم الرسائل بنفسك (اختياري)#
كل رسالة تُطلق appmint:inapp بـ { type: 'shown' | 'clicked' | 'dismissed', id, name } (وتستدعي window.onAppMintInApp(detail) إن عرّفتها).
لرسم الرسائل بنفسك، استدعِ WebToApk.setInAppPresentation('none'): عندها لا يرسم التطبيق شيئًا ويحمل حدث 'shown' القيمة presented: false والرسالة (العنوان والنص والصورة والأزرار). وsetInAppPresentation('auto') يعيد الرسم إلى التطبيق. وWebToApk.getInAppCampaigns() يعرض ما يحتفظ به هذا التثبيت ([{id, name}]).
كل ذلك يحتاج AppMint Push في البناء؛ وفي أي بناء آخر تُجيب الدوال بـ false / "[]".
window.addEventListener('appmint:inapp', e => {
// e.detail = { type: 'shown' | 'clicked' | 'dismissed', id, name, presented?, message? }
if (e.detail.type === 'shown' && e.detail.presented === false) drawMyBanner(e.detail.message);
});
WebToApk.setInAppPresentation('none'); // 'auto' gives drawing back to the app
const held = JSON.parse(WebToApk.getInAppCampaigns() || '[]'); // [{id, name}]26ابدأ من قالب#
'+ New' يفتح معرضًا لرسائل جاهزة، كل منها معاينة حية يمكنك البحث فيها أو تصفيتها حسب التخطيط: Welcome وRate us وTurn on notifications وWhat's new وFlash sale (بعدّ تنازلي حي) وSeasonal promo وNew feature وUpdate available وAbandoned cart وWin back وStar survey وNPS score وInvite friends وSubscription offer وStreak وTip وPermission explainer وMaintenance (تبقى حتى تُغلق) وTerms update (بلا زر إغلاق) وFollow us. يملأ القالب التخطيط والرمز التعبيري أو الصورة والنص والأزرار والمُشغّل والتكرار - غيّر أي شيء قبل الحفظ. 'Blank message' يبدأ فارغًا.
Star survey وRate us وNPS تطرح سؤالًا: صف من 1-5 نجوم أو درجة من 0-10. الزر الأول ينتظر إجابة؛ وتُرسل الإجابة مرة واحدة عند إغلاق الرسالة، كحدث appmint:inapp 'answered' { value, question }، ويعرض مركز الإرسال متوسط النجوم أو درجة NPS مع التوزيع.
يمكن أن تكون روابط الأزرار أيضًا appmint://review (نافذة المراجعة في Google Play) وshare:text (نافذة المشاركة) وcopy:text (الحافظة) وroute:/page وevent:name. يمكن للنص استخدام {app} و{store} و{name} و{streak} و{tag:key}، وتُملأ على كل هاتف؛ و{name|friend} تعطي كلمة بديلة عند غياب القيمة. الرسالة التي لا قيمة لمتغيرها لا تُعرض. تحتاج تطبيقًا مبنيًا بهذا الإصدار أو أحدث.
window.addEventListener('appmint:inapp', e => {
const d = e.detail;
if (d.type === 'answered') {
// d.question: 'stars' (1-5) or 'nps' (0-10); d.template e.g. 'survey_stars'
if (d.question === 'nps' && d.value <= 6) openFeedbackForm();
}
if (d.type === 'clicked' && d.link === 'event:allow') askForLocation();
});
// {streak} and {tag:key} come from push tags
WebToApk.setPushTag('streak', '7');