ساخت APK رایگان

اعلان‌ها

AppMint Push - به کاربران خود اعلان بفرستید

از داخل AppMint و روی پروژه Firebase خودتان به همه نصب‌کنندگان اپلیکیشن اعلان بفرستید - زمان‌بندی، ویرایش پس از ارسال، لغو، پیوندهای عمیق

1چگونه کار می‌کند#

AppMint Push از داخل AppMint به همه نصب‌کنندگان اپلیکیشن شما اعلان می‌فرستد - ارسال فوری، زمان‌بندی، ویرایش پس از ارسال، لغو، پیوندهای عمیق.

هر پیام را می‌توان طراحی کرد: ۸ قالب، رنگ دلخواه شما، تا ۳ دکمه که هرکدام صفحه خودش را باز می‌کند، انتخاب صدا و پاپ‌آپ، و یک بنر، کارت، برگه یا تمام‌صفحه بومی درون‌برنامه‌ای وقتی اپلیکیشن باز است. پیش‌نمایش زنده دقیقاً همان‌طور که روی گوشی کاربران می‌بینند نشان می‌دهد.

روی پروژه 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 را انتخاب کنید
  • نام بسته را دقیقاً همان‌طور که در ویزارد AppMint تنظیم شده وارد کنید (مثلاً com.yourname.yourapp) - عدم تطابق یعنی اعلان‌ها هرگز نمی‌رسند، و AppMint به همین دلیل ساخت را رد می‌کند
  • روی 'Register app' کلیک کنید و google-services.json را دانلود کنید
  • می‌توانید مراحل باقی‌مانده SDK را رد کنید - AppMint آن‌ها را انجام می‌دهد

4آن را روشن کنید و فایل را بارگذاری کنید#

در کارت اعلان‌های Push در ویزارد ساخت:

  • 'AppMint Push' را فعال کنید
  • روی 'Upload google-services.json' ضربه بزنید و فایل مرحله قبل را انتخاب کنید

ویزارد بررسی می‌کند که فایل نام بسته شما را دارد. سپس APK خود را مثل همیشه بسازید - در حین ساخت، اپلیکیشن شما برای Push روی پروژه شما ثبت می‌شود.

کاربران فقط اپلیکیشن را نصب می‌کنند و یک بار باز می‌کنند. در Android 13 به بالا، بعد از بارگذاری اولین صفحه از آن‌ها خواسته می‌شود اعلان‌ها را مجاز کنند.

قالب‌ها، دکمه‌ها و سبک‌های درون‌برنامه‌ای به اپلیکیشنی نیاز دارند که با این نسخه AppMint یا جدیدتر ساخته شده باشد. ساخت قدیمی‌تر هنوز هر پیام را دریافت می‌کند - آن را با همان سبک ساده همیشگی نشان می‌دهد.

5کلید حساب سرویس خود را بارگذاری کنید (یک بار)#

AppMint از طریق پروژه شما می‌فرستد، پس به کلیدی از آن نیاز دارد - همان فایلی که OneSignal می‌خواهد.

در Firebase Console:

  • ⚙ تنظیمات پروژه ← زبانه 'Service accounts'
  • روی 'Generate new private key' کلیک کنید و تأیید کنید - یک فایل JSON دانلود می‌شود

در AppMint: Home > Notifications ← اپلیکیشن خود را انتخاب کنید ← 'Upload key' ← آن JSON را انتخاب کنید.

AppMint پیش از ذخیره (رمزگذاری‌شده) کلید را با یک ارسال آزمایشی به پروژه شما تأیید می‌کند، پس تیک سبز یعنی ارسال بعدی واقعاً انجام می‌شود. یک بارگذاری برای هر اپلیکیشن؛ ساخت دوباره اپلیکیشن دوباره به آن نیاز ندارد مگر پروژه Firebase را عوض کنید.

⚠️ کلید حساب سرویس را اینجا بارگذاری کنید، نه google-services.json - اگر این دو را قاطی کنید صفحه به شما می‌گوید. برای لغو دسترسی بعداً، کلید را در Firebase Console حذف کنید.

6اولین اعلان خود را بفرستید#

در Home > Notifications:

  • اپلیکیشن خود را انتخاب کنید
  • یک عنوان بنویسید (پیام، تصویر و پیوند اختیاری‌اند)
  • کارت پیش‌نمایش زنده را بررسی کنید
  • روی 'Send Notification' ضربه بزنید

هر گوشی که اپلیکیشن شما نصب است آن را دریافت می‌کند.

برای تصویر، روی کادر Image ضربه بزنید: 'Choose from device' (تا 2 MB، PNG، JPEG یا WebP) یا 'Paste an image link' (https://). تصویر انتخاب‌شده فقط وقتی Send را بزنید بارگذاری می‌شود - می‌توانید پیش از آن هر چند بار که بخواهید انتخاب، جایگزین یا حذف کنید.

7یک قالب انتخاب کنید#

طراحی ← قالب، چیدمان اعلان را تعیین می‌کند. متن همیشه اول می‌آید - تصویر هرگز پیام را نمی‌پوشاند:

  • خودکار - کارت تصویری وقتی پیام تصویر دارد، وگرنه استاندارد
  • استاندارد - عنوان و کل پیام؛ تصویر به یک بندانگشتی کوچک کنار آن تبدیل می‌شود
  • کارت تصویری - تصویر زیر عنوان و پیام خوانا
  • بنر - کارتی پر شده با رنگ شما، با نشان اختیاری
  • تبلیغاتی - یک نشان مثل '50% OFF' و یک دکمه رنگی (دکمه اول شما)
  • فهرست - تا ۶ خط کوتاه، مثلاً چند به‌روزرسانی سفارش
  • شمارش معکوس - یک زمان‌سنج زنده که تا تاریخ و ساعتی که انتخاب می‌کنید معکوس می‌شمارد، سپس خودش از سینی می‌رود
  • پیشرفت - یک نوار پیشرفت؛ با ویرایش و ارسال دوباره با مقدار جدید، نوار روی هر گوشی بدون لرزش دوباره جلو می‌رود
  • حداقلی - عنوان و یک خط، بدون صدا، بدون پاپ‌آپ

اندازه متن و تصویر با اندازه قلم هر کاربر تطبیق می‌یابد، پس در گوشی‌های با متن بزرگ چیزی بریده نمی‌شود.

8یک رنگ انتخاب کنید#

طراحی ← رنگ، آیکون، بنر، دکمه‌ها و شمارش معکوس اعلان را رنگ می‌کند. یکی از ۹ رنگ آماده یا '+' برای هر #RRGGBB را انتخاب کنید.

هر رنگ آماده روی گوشی‌های روشن و تیره خوانا است. رنگ دلخواه با هر دو بررسی می‌شود: اگر خیلی کم‌رنگ یا خیلی تیره باشد، یادداشت زیر رنگ‌ها این را می‌گوید، و 'Fix contrast' در کادر رنگ دلخواه آن را به نزدیک‌ترین سایه‌ای که کار می‌کند می‌برد و ته‌رنگش را حفظ می‌کند. متن روی دکمه یا بنر رنگی خودکار سیاه یا سفید می‌شود.

از کاشی‌های 'Light phone' / 'Dark phone' در پیش‌نمایش زنده استفاده کنید تا هر دو را ببینید.

9افزودن دکمه‌ها#

طراحی ← دکمه‌ها: '+ Add button' (تا ۳). هرکدام یک برچسب (تا ۲۴ نویسه) و پیوند خودش را دارد - مثلاً 'Track order' ← #/orders/1042 و 'Help' ← #/support. پیوند یک دکمه را خالی بگذارید تا پیوند اصلی را باز کند.

دکمه‌ها زیر اعلان در سینی و در نمایش درون‌برنامه‌ای دیده می‌شوند. در قالب Promo دکمه اول به دکمه رنگی بزرگ روی کارت تبدیل می‌شود.

10وقتی اپلیکیشن باز است#

طراحی ← 'While the app is open' تعیین می‌کند وقتی پیام در حین استفاده کاربر از اپلیکیشن می‌رسد او چه می‌بیند:

  • طراحی خود اپلیکیشن (پیش‌فرض) - کد اپلیکیشن شما آن را نشان می‌دهد (پایین‌تر In-App Inbox را ببینید)
  • بنر بالا - از بالا پایین می‌لغزد و بعد از چند ثانیه خودش پنهان می‌شود
  • کارت مرکزی - یک کارت روی اپلیکیشن تیره‌شده با تصویر، متن و دکمه‌ها
  • برگه پایین - همان کارت که از پایین بالا می‌آید
  • تمام‌صفحه - یک تصویر بزرگ با دکمه‌ها در پایین

نحوه نمایش از تم روشن یا تیره گوشی پیروی می‌کند و دکمه برگشت یا ضربه بیرون آن را می‌بندد. وقتی نمایش داده می‌شود، همان پیام در سینی اعلان‌ها هم گذاشته نمی‌شود - کاربر همین حالا آن را می‌بیند.

با 'In-app only' (Delivery ← Show as)، پیامی که وقتی اپلیکیشن بسته است می‌رسد، دفعه بعد که کاربر آن را باز کند نشان داده می‌شود.

11صدا، پاپ‌آپ و زمان‌بندی#

طراحی ← رفتار:

  • صدا - برای اعلان بی‌صدا خاموش کنید
  • نمایش روی صفحه - خاموش کنید تا روی کاری که کاربر انجام می‌دهد ظاهر نشود (باز هم در سینی می‌نشیند)
  • بستن خودکار - اعلان را بعد از ۳۰ ثانیه تا ۳ روز از سینی برمی‌دارد (Android 8 و جدیدتر)

گزینه‌های پیشرفته:

  • تصویر آیکون / آواتار - یک تصویر گرد کنار متن (پیوند https://)
  • کلید دسته - پیام‌هایی که آن را مشترکاً دارند زیر یک عنوان گروه‌بندی می‌شوند
  • کلید جایگزینی - پیام جدیدتر با همان کلید، پیام قدیمی‌تر را روی گوشی و در صندوق ورودی جایگزین می‌کند، مثلاً نتیجه زنده یک مسابقه

کاربران همچنین می‌توانند صدا را برای هر نوع در تنظیمات اعلان Android برای اپلیکیشن شما تنظیم کنند.

صدای خودتان: در گام‌شمار، Integrate ← Push Notifications ← Notification sound (MP3، OGG، WAV، M4A، AAC، FLAC یا Opus، تا 1 MB و ۳۰ ثانیه). برای هر پیامی که با 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، زیر When روی 'Schedule' ضربه بزنید، بعد تاریخ و ساعت را انتخاب کنید. اعلان در همان لحظه خودکار ارسال می‌شود.

تا وقتی ارسال نشده، می‌توانید آن را از فهرست 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 در خود اپلیکیشن نصب‌شده هم ذخیره می‌شود (۵۰ آخر)، پس اپلیکیشن شما می‌تواند صفحه اعلان‌های خودش را با نشان خوانده‌نشده‌ها نشان دهد. در هر حالت ساخت کار می‌کند - از جمله اپلیکیشن‌های وب‌سایت (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 own

17اگر چیزی به گوشی آزمایشی شما نرسید#

تقریباً همیشه یک محدودیت روی گوشی آزمایشی است، نه اپلیکیشن یا کاربران شما.

Android تقریباً ۱۰۰ ثبت Push برای هر گوشی اجازه می‌دهد. هر نصب تازه اپلیکیشنی که از اعلان استفاده می‌کند یکی را مصرف می‌کند - پس نصب ساخت پشت ساخت هنگام آزمایش می‌تواند همه را تمام کند، و آن گوشی دیگر برای اپلیکیشن‌های تازه نصب‌شده دریافت نمی‌کند.

جایگاه‌ها را آزاد کنید (این چیزی است که واقعاً جواب می‌دهد):

  • اپلیکیشن‌های آزمایشی را که دیگر نیاز ندارید حذف کنید - Android جایگاهی را که هرکدام گرفته بود آزاد می‌کند
  • یا داده‌های یک اپلیکیشن آزمایشی را پاک کنید: Settings > Apps > [آن اپلیکیشن] > Storage > Clear data - این جایگاهش را بدون حذف نصب آزاد می‌کند
  • روی شبیه‌ساز، پاک کردن آن همه جایگاه‌ها را یک‌جا بازنشانی می‌کند

راه‌اندازی مجدد گوشی کمک نمی‌کند: این ثبت‌ها دائمی ذخیره می‌شوند، برای همین از راه‌اندازی مجدد جان به در می‌برند. پاک کردن حافظه نهان Google Play Services هم آن‌ها را آزاد نمی‌کند.

هنگام آزمایش از این پرهیز کنید:

  • هنگام تکرار فقط یک نام بسته نگه دارید - هر نام بسته متفاوت جایگاه خودش را می‌گیرد
  • APK جدید را روی قدیمی نصب کنید، به‌جای اینکه اول حذف کنید - به‌روزرسانی ثبت موجود را نگه می‌دارد، نصب دوباره یک ثبت جدید مصرف می‌کند
  • روی یک گوشی یدکی یا شبیه‌ساز آزمایش کنید؛ پاک کردن شبیه‌ساز جایگاه‌هایش را فوراً بازنشانی می‌کند
  • اپلیکیشن‌های آزمایشی را که کارتان با آن‌ها تمام شده حذف کنید

مبانی را هم بررسی کنید: اپلیکیشن بعد از نصب حداقل یک بار باز شده و اعلان‌ها در تنظیمات Android برایش مجاز است. اپلیکیشن در هر اجرا دوباره مشترک می‌شود، پس وقتی جایگاه‌ها آزاد شدند خودش بهبود می‌یابد - ساخت دوباره لازم نیست.

18محدودیت‌ها و روش‌های خوب#

  • بدون محدودیت در تعداد اعلان‌هایی که می‌فرستید - Firebase Cloud Messaging رایگان است
  • عنوان تا ۱۲۰ نویسه، پیام تا ۱۰۰۰؛ پیوند تصویر و آیکون باید https:// باشد
  • تا ۳ دکمه (برچسب‌های ۲۴ نویسه‌ای) و تا ۶ خط فهرست
  • در طرح رایگان یک تبلیغ کوتاه پیش از هر ارسال پخش می‌شود
  • اپلیکیشن‌های آزمایشی: با آیکون سطل زباله کنار انتخابگر اپلیکیشن آن‌ها را حذف کنید - این فقط تاریخچه و کلید ذخیره‌شده را در 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 Sep 2026 به بعد دارند (خودشان را ثبت می‌کنند). گوشی‌های با ساخت قدیمی‌تر هنوز ارسال‌های 'Everyone' را می‌گیرند - برای رسیدن به آن‌ها از این راه هم، دوباره بسازید و به‌روزرسانی منتشر کنید.

20هدف‌گیری کاربران واردشده و برچسب‌ها#

صفحه اپلیکیشن شما به AppMint Push می‌گوید چه کسی وارد شده و درباره این نصب چه باید بداند. بعد می‌توانید به یک کاربر، یا به همه کسانی که برچسبی مثل plan = pro دارند بفرستید.

  • setPushUser - بعد از ورود، با شناسه حساب خودتان (شناسه پایگاه داده، هرگز آدرس ایمیل یا شماره تلفن). حروف، ارقام و _ @ . : + - (تا ۱۲۸). هنگام خروج آن را با "" فراخوانی کنید، وگرنه گوشی همچنان پیام‌های آن کاربر را می‌گیرد
  • setPushTag / setPushTags - نام برچسب (حروف، ارقام و _، تا ۳۲) و یک مقدار (تا ۱۲۸). "" یک برچسب را برمی‌دارد؛ تا ۵۰ برچسب برای هر نصب
  • 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 دقیقه بعد از نصب جدید (از ۰ دقیقه تا ۳۰ روز). هر گوشی یک بار آن را می‌گیرد
  • بازگشت مشتری - وقتی کسی N روز (۱ تا ۱۸۰) اپلیکیشن را باز نکرده باشد. یک بار برای هر غیبت: گوشی که برمی‌گردد و دوباره دور می‌ماند، دوباره آن را می‌گیرد
  • برچسب - N دقیقه بعد از اینکه صفحه اپلیکیشن شما یک برچسب می‌گذارد، در صورت تمایل فقط برای یک مقدار. فقط وقتی ارسال می‌شود که برچسب تا پایان زمان هنوز تنظیم باشد

سبد رهاشده: وقتی کالاها در سبد قرار می‌گیرند یک برچسب بگذارید و هنگام پرداخت آن را بردارید. یک اتوماسیون 'cart' با تأخیر ۶۰ دقیقه‌ای فقط به کسانی یادآوری می‌کند که بدون خرید رفته‌اند. تنظیم دوباره همان مقدار زمان‌سنج را از نو شروع نمی‌کند؛ بعد از برداشتن برچسب، تنظیم دوباره آن می‌تواند یک بار دیگر ارسال کند.

اتوماسیون‌ها در محدودیت روزانه برای هر گوشی شمرده می‌شوند و به گوشی‌هایی با ساخت‌های ساخته‌شده از 30 Sep 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رسیدن به کاربران با اعلان‌های خاموش#

گوشی‌ای که اعلان‌هایش خاموش است هرگز اعلان سینی نشان نمی‌دهد - اما پیام شما همچنان به اپلیکیشن می‌رسد و یک پیام درون‌برنامه‌ای دفعه بعد که کاربر آن را باز کند ظاهر می‌شود. از آن برای خواستن از آن‌ها استفاده کنید که اعلان‌ها را دوباره روشن کنند:

  • چه کسی دریافت می‌کند ← انتخاب مخاطب ← 'Notifications off' را روشن کنید
  • نمایش به‌صورت ← فقط درون‌برنامه‌ای (Top banner یا Centre card زیر Design)
  • طراحی ← دکمه‌ها ← '+ دکمه «روشن کردن اعلان‌ها»'. پیوند آن appmint://notifications/enable است: ضربه، درخواست مجوز را نشان می‌دهد، یا وقتی دیگر نمی‌توان درخواست را نشان داد تنظیمات اعلان اپلیکیشن را باز می‌کند

وقتی اپلیکیشن گوشی‌هایی با اعلان خاموش دارد، مرکز ارسال زیر کلید Firebase عبارت 'Reach the N phones with notifications off' را نشان می‌دهد - یک ضربه هر سه را تنظیم می‌کند. به محض اینکه کاربر اعلان‌ها را روشن کند، گوشی‌اش از آن مخاطبان خارج می‌شود.

دکمه به اپلیکیشنی نیاز دارد که با این نسخه 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' با همان نام است، همین حالا (یا بعد از انتظاری که انتخاب کرده‌اید) نشان داده می‌شود. نام‌ها: حروف، ارقام و _ . : - (تا ۶۴). رویدادها هیچ‌جا شمرده یا ذخیره نمی‌شوند؛ فقط تعیین می‌کنند پیامی نشان داده شود یا نه.

پیام‌های مسیر خودشان تغییرات واقعی URL را دنبال می‌کنند (بارگذاری صفحه، 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' خالی شروع می‌کند.

نظرسنجی ستاره‌ای، Rate us و NPS یک سؤال می‌پرسند: ردیف ۱ تا ۵ ستاره یا نمره ۰ تا ۱۰. دکمه اول منتظر پاسخ می‌ماند؛ پاسخ یک بار، وقتی پیام بسته می‌شود، به‌صورت رویداد 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');

این صفحه از راهنمای یکپارچه‌سازی داخل خود اپلیکیشن ساخته می‌شود، پس دقیقاً همان چیزی را می‌گوید که نسخه فعلی می‌گوید. آن را به‌صورت Markdown بخوانید.

بررسی‌شده با راهنمای منتشرشده در 2026-10-22.