اعلانها
اعلانها و یادآورهای محلی
اعلانهای فوری نشان دهید، یا یادآورهایی زمانبندی کنید که حتی وقتی اپلیکیشن بسته است اجرا میشوند - روی خود دستگاه، بدون سرور
1این چه چیزی اضافه میکند#
اپلیکیشن شما میتواند اعلانهای Android را از کد خودش نشان دهد - در دو سطح:
- فوری (سطح 1): اعلانی که همین الان، در حالی که اپلیکیشن باز است، ظاهر میشود. برای «دانلود کامل شد»، «تایمر تمام شد» و مانند آن مناسب است.
- یادآورهای زمانبندیشده (سطح 2): اعلانی که در زمانی در آینده حتی وقتی اپلیکیشن بسته است اجرا میشود و از راهاندازی دوباره جان سالم به در میبرد. این همان چیزی است که اپلیکیشنهای یادآور، عادت، زنگ هشدار و دارو لازم دارند.
اینها 100٪ روی دستگاه و آفلاین هستند - بدون سرور، بدون حساب OneSignal. (پوش OneSignal یک قابلیت جداگانه برای پیامهایی است که شما از سرور میفرستید.)
2آن را در جادوگر ساخت روشن کنید#
در مرحله 4 (دسترسی)، این را تیک بزنید:
- 🔔 اعلانها - به اپلیکیشن اجازه میدهد اعلان ارسال کند (POST_NOTIFICATIONS را اضافه میکند).
- ⏰ یادآورها - اعلانهای زمانبندیشدهای اضافه میکند که وقتی اپلیکیشن بسته است اجرا میشوند (زیرساخت زنگ دقیق + زمانبندی مجدد پس از راهاندازی را اضافه میکند). تیک زدن یادآورها، اعلانها را خودکار فعال میکند.
برای اپلیکیشنهایی که به اعلان نیاز ندارند هر دو را خاموش بگذارید - چیز اضافهای به APK شما افزوده نمیشود.
3پل را از کد وب خود فراخوانی کنید#
AppMint یک پل جاوااسکریپت در window.WebToApk ارائه میدهد. همیشه ابتدا وجود آن را بررسی کنید - فقط داخل اپلیکیشن نصبشده وجود دارد، پس سایت شما همچنان در مرورگر کار میکند.
const b = window.WebToApk || null;
// Ask once (Android 13+):
b?.requestNotificationPermission();
// Tier 1 — instant (app open):
b?.showNotification('Saved', 'Your note was saved', '', 'note');
// Tier 2 — scheduled reminder in 1 hour:
b?.scheduleNotification(
'water-1',
'Drink water',
'Time for a glass of water',
String(Date.now() + 60*60*1000),
'daily' // none | minutely | hourly | daily | weekly
);
b?.cancelNotification('water-1');
b?.cancelAllNotifications();
const pending = JSON.parse(b?.getScheduledNotifications() || '[]');4بگذارید هوش مصنوعی آن را برایتان وصل کند#
در AI App Studio فقط توضیح دهید چه میخواهید - مثلاً «یادآور آب که هر 2 ساعت به من اعلان بدهد» یا «پیگیر دارو که هر روز ساعت 8 صبح یادآوری کند». وقتی درخواست شما یادآور/زنگ/اعلان را ذکر میکند، AppMint بهطور خودکار این پل را به هوش مصنوعی آموزش میدهد تا اپلیکیشن تولیدشده درست از آن استفاده کند (با جایگزین مناسب وقتی در دسترس نباشد).
5صدای خودتان به جای صدای پیشفرض Android#
یک فایل صوتی (mp3، wav، ogg، m4a، flac یا opus) در بسته وب خود بگذارید و مسیر آن را به عنوان صدا بنویسید. روی یک اعلان فوری و روی یادآوری که چند روز بعد با اپلیکیشن بسته اجرا میشود، یکسان کار میکند.
فایل هنگام زمانبندی در جای خود کپی میشود، پس نام فایل اشتباه همان لحظه false برمیگرداند، نه اینکه ساعت 7 صبح به صدای پیشفرض تبدیل شود.
یک قانون Android که دانستنش ارزش دارد: صدای کانال اعلان هنگام ساخت کانال ثابت میشود، پس AppMint برای هر صدا یک کانال جداگانه میسازد. بنابراین تغییر صدا تنظیمات خود آن کانال را در صفحه اعلانهای Android بازنشانی میکند - اجتنابناپذیر است و صادقانهترین رفتار.
const b = window.WebToApk || null;
// Instant, with your sound:
b?.notify(JSON.stringify({
title: 'Order confirmed',
body: 'Arriving Tuesday',
sound: '/audio/chime.mp3' // a file in YOUR bundle
}));
// Check a sound before you save it in a settings screen:
const ok = b?.prepareNotificationSound('/audio/chime.mp3');
// 'silent' for no sound at all; leave it out for the Android default.6یادآورها با صدا، تصویر و دکمه#
scheduleNotificationEx() هر آنچه notify() میگیرد را میگیرد، بهعلاوه زمان اجرا. وقتی بیش از یک عنوان و یک متن میخواهید، به جای scheduleNotification() قدیمی با پنج آرگومان از آن استفاده کنید.
const b = window.WebToApk || null;
b?.scheduleNotificationEx('dose-1', JSON.stringify({
at: Date.now() + 60*60*1000, // epoch millis
repeat: 'daily', // none|minutely|hourly|daily|weekly
title: 'Time for your dose',
body: 'Vitamin D — 1 tablet',
sound: '/audio/chime.mp3',
actions: [{ id: 'taken', label: 'Taken' }]
}));
// Returns false if the sound file does not exist — check it.7باز کردن خود اپلیکیشن در زمان مشخص#
openApp: true را اضافه کنید و یادآوری به یک هشدار تمامصفحه تبدیل میشود: روی گوشی قفلشده اپلیکیشن روی صفحه قفل باز میشود، و روی گوشی بازشده به صورت بنر ظاهر میشود.
این همه آن چیزی است که Android اجازه میدهد. یک اپلیکیشن نمیتواند بیصدا خودش را در پسزمینه اجرا کند - این از Android 10 مسدود شده است - پس هر صفحهای که وعده میدهد «اپلیکیشن ساعت 7 صبح خودش باز میشود» باید از این مسیر برود. در Android 14+ کاربر هشدار را برای هر اپلیکیشن مجاز میکند؛ canOpenAppAtTime() را بررسی کنید و اگر گفت denied، کاربر را به صفحه تنظیمات بفرستید.
وقتی اپلیکیشن به این روش باز میشود، صفحه شما یک رویداد appmint:reminder دریافت میکند، تا بتواند کاری را انجام دهد که هنگام بسته بودن نمیتوانست.
const b = window.WebToApk || null;
if (b?.canOpenAppAtTime() === 'denied') b?.requestOpenAppPermission();
b?.scheduleNotificationEx('standup', JSON.stringify({
at: tomorrowAt9am, repeat: 'daily',
title: 'Stand-up', body: 'Daily sync starts now',
sound: '/audio/alarm.mp3',
openApp: true
}));
window.addEventListener('appmint:reminder', e => {
// e.detail = { id: 'standup', overLockScreen: true }
showReminderScreen(e.detail.id);
});8قابلیت اطمینان روی دستگاههای واقعی#
یادآورهای زمانبندیشده تا جایی که Android اجازه میدهد قابل اعتماد هستند:
- در Android 12+، زمانبندی دقیق به SCHEDULE_EXACT_ALARM نیاز دارد. اگر برای اپلیکیشن شما خاموش باشد، یادآور در یک بازه 10 دقیقهای تنظیم میشود (دیرتر وقتی گوشی در خواب است)، و اپلیکیشن یک بار آن را به کاربر توضیح میدهد. از getAlarmPrecision() بپرسید - پاسخ میدهد 'exact' یا 'inexact' - و requestExactAlarms() را فراخوانی کنید تا کاربر را به آن تنظیم بفرستید. یک اپلیکیشن ساعت زنگدار یا تقویم میتواند در جادوگر «My app is an alarm clock or calendar app» را تیک بزند: آنگاه زنگهای دقیق همیشه روشن هستند (Google Play اعلامیه Exact alarm را در Play Console میخواهد).
- برخی گوشیها (Xiaomi، Samsung، Oppo و غیره) برای صرفهجویی در باتری زنگهای پسزمینه را نگه میدارند یا متوقف میکنند. اپلیکیشن این را یک بار توضیح میدهد (با مسیر Background usage limits سامسونگ) و فهرست بهینهسازی باتری را باز میکند.
- یادآورها پس از راهاندازی دوباره یا بهروزرسانی اپلیکیشن بهطور خودکار دوباره تنظیم میشوند.
9کاربرانی را که اعلانها را خاموش کردهاند برگردانید#
بسیاری از افراد در پیام اعلان Android 13 روی «Don't allow» میزنند یا آن را رد میکنند، و Android آن پیام را فقط تعداد محدودی بار نشان میدهد. پس از آن فقط تنظیمات اعلان اپلیکیشن میتواند آنها را دوباره روشن کند.
AppMint.enableNotifications() از یک دکمه که کاربر زده است کار درست را انجام میدهد: تا زمانی که Android هنوز میتواند پیام مجوز را نشان دهد آن را نشان میدهد، وگرنه تنظیمات اعلان اپلیکیشن را باز میکند - و وقتی کاربر برمیگردد وضعیت جدید را به شما میگوید. getNotificationState() پاسخ میدهد 'granted'، 'prompt' (هنوز میتوان پرسید)، 'blocked' (فقط تنظیمات میتواند درستش کند) یا 'unavailable' (این ساخت اعلان ندارد). بنر خود را فقط برای 'prompt' و 'blocked' نشان دهید، و هرگز هنگام راهاندازی نپرسید.
یک دکمه پوش یا پیام درونبرنامهای با پیوند appmint://notifications/enable بدون هیچ کد صفحهای همین کار را میکند.
const A = window.AppMint;
if (A?.enableNotifications) {
const state = await A.getNotificationState();
// 'granted' | 'prompt' | 'blocked' | 'unavailable'
banner.hidden = !(state === 'prompt' || state === 'blocked');
turnOnButton.onclick = async () => {
const r = await A.enableNotifications();
// r = { state, changed, openedSettings }
banner.hidden = r.state === 'granted';
};
}
// Just the settings screen:
A?.openNotificationSettings?.();