नोटिफ़िकेशन
लोकल नोटिफ़िकेशन और रिमाइंडर
तुरंत नोटिफ़िकेशन दिखाएँ, या ऐसे रिमाइंडर शेड्यूल करें जो ऐप बंद होने पर भी बजें - डिवाइस पर ही, बिना सर्वर के
1यह क्या जोड़ता है#
आपका ऐप अपने ही कोड से Android नोटिफ़िकेशन दिखा सकता है - दो स्तर:
- तुरंत (Tier 1): ऐसा नोटिफ़िकेशन जो ऐप खुला होने पर अभी दिखता है। 'डाउनलोड पूरा हुआ', 'टाइमर ख़त्म हुआ' आदि के लिए अच्छा है।
- शेड्यूल्ड रिमाइंडर (Tier 2): ऐसा नोटिफ़िकेशन जो ऐप बंद होने पर भी भविष्य के समय पर बजता है और रीबूट के बाद भी बना रहता है। रिमाइंडर, आदत, अलार्म और दवा वाले ऐप्स को यही चाहिए।
ये 100% डिवाइस पर और ऑफ़लाइन चलते हैं - न सर्वर, न OneSignal अकाउंट। (OneSignal पुश एक अलग फ़ीचर है, उन संदेशों के लिए जो आप किसी सर्वर से भेजते हैं।)
2बिल्ड विज़ार्ड में इसे चालू करें#
चरण 4 (Access) में, ये चुनें:
- 🔔 Notifications - ऐप को नोटिफ़िकेशन भेजने देता है (POST_NOTIFICATIONS जोड़ता है)।
- ⏰ Reminders - ऐसे शेड्यूल्ड नोटिफ़िकेशन जोड़ता है जो ऐप बंद होने पर भी बजते हैं (exact-alarm और रीबूट पर दोबारा शेड्यूल करने की व्यवस्था जोड़ता है)। Reminders चुनने पर Notifications अपने आप चालू हो जाता है।
जिन ऐप्स को नोटिफ़िकेशन नहीं चाहिए, उनके लिए दोनों बंद रखें - आपके APK में कुछ अतिरिक्त नहीं जुड़ता।
3अपने वेब कोड से ब्रिज को कॉल करें#
AppMint window.WebToApk पर एक JavaScript ब्रिज देता है। इसे हमेशा पहले feature-detect करें - यह सिर्फ़ इंस्टॉल किए गए ऐप के अंदर मौजूद होता है, इसलिए आपकी साइट ब्राउज़र में भी चलती रहती है।
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() || '[]');4AI से इसे जुड़वा लें#
AI App Studio में बस बताएँ कि आप क्या चाहते हैं - जैसे 'पानी का रिमाइंडर जो हर 2 घंटे में याद दिलाए' या 'दवा ट्रैकर जो रोज़ सुबह 8 बजे याद दिलाए'। जब आपके अनुरोध में रिमाइंडर/अलार्म/नोटिफ़िकेशन का ज़िक्र होता है, AppMint अपने आप AI को इस ब्रिज के बारे में सिखा देता है ताकि बना हुआ ऐप इसे सही से इस्तेमाल करे (और जब यह उपलब्ध न हो तब भी ठीक से चले)।
5Android की डिफ़ॉल्ट ध्वनि की जगह आपकी अपनी ध्वनि#
अपने वेब बंडल में एक ऑडियो फ़ाइल रखें (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” चुन सकता है: तब exact alarms हमेशा चालू रहते हैं (Google Play को Play Console में Exact alarm घोषणा चाहिए)।
- कुछ फ़ोन (Xiaomi, Samsung, Oppo आदि) बैटरी बचाने के लिए बैकग्राउंड अलार्म रोक देते हैं या देर से बजाते हैं। ऐप यह एक बार समझाता है (Samsung के Background usage limits रास्ते के साथ) और बैटरी-ऑप्टिमाइज़ेशन की सूची खोलता है।
- रीबूट या ऐप अपडेट के बाद रिमाइंडर अपने आप फिर से सेट हो जाते हैं।
9नोटिफ़िकेशन बंद कर चुके उपयोगकर्ताओं को वापस लाएँ#
कई लोग Android 13 के नोटिफ़िकेशन संदेश पर 'Don't allow' दबा देते हैं, या उसे छोड़ देते हैं, और Android वह संदेश सीमित बार ही दिखाता है। उसके बाद उन्हें सिर्फ़ ऐप की नोटिफ़िकेशन सेटिंग्स से ही चालू किया जा सकता है।
AppMint.enableNotifications() उपयोगकर्ता के दबाए बटन से सही काम करता है: जब तक Android संदेश दिखा सकता है तब तक अनुमति का संदेश, नहीं तो ऐप की नोटिफ़िकेशन सेटिंग्स - और उपयोगकर्ता के लौटने पर आपको नई स्थिति बताता है। getNotificationState() जवाब देता है 'granted', 'prompt' (अब भी पूछा जा सकता है), 'blocked' (सिर्फ़ Settings ठीक कर सकती है) या '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?.();