Ang lokal na notipikasyon ay isang mensahe na ipinapadala ng app sa user nang walang partisipasyon ng malayuang server. Lahat ng data ay pinoproseso at ipinapakita nang direkta sa device ng tatanggap. Ang ganitong mekanismo ay angkop para sa mga paalala, timer, at alarm kapag ang app ay nasa background o sarado. Ayon sa Apple Developer Documentation, ang UNUserNotificationCenter ay nagbibigay ng sentralisadong pamamahala ng mga lokal na notipikasyon sa iOS.
Mga Pangunahing Punto
Ang lokal na notipikasyon ay isang trigger na mensahe na nabubuo at ipinapakita ng operating system sa parehong device kung saan naka-install ang app. Hindi tulad ng mga push notification, ang mga lokal ay hindi dumadaan sa panlabas na server — lahat ng lohika ng pag-iiskedyul ay isinasagawa sa client side.
Ang mga ganitong notipikasyon ay gumagana anuman ang estado ng app: aktibo, naka-minimize, o ganap na sarado. Ang operating system ang pumapangalawa sa paghahatid sa nakatakdang oras, at ang developer ay tumutukoy lamang ng nilalaman at trigger.
Sisiguraduhin ng system ang paghahatid ng lokal na notipikasyon kahit walang network. Ito ay pangunahing bentahe kumpara sa mga push notification na nangangailangan ng matatag na koneksyon sa internet at gumaganang server.
Ang bawat lokal na notipikasyon ay binubuo ng tatlong bahagi: nilalaman (pamagat, katawan, tunog), trigger (kondisyon ng oras o geo), at identifier ng kahilingan. Ang identifier ay nagbibigay-daan sa pagkansela o pag-update ng notipikasyon bago ito maihatid.
Ang developer ay maaaring magtakda ng hanggang 64 na lokal na notipikasyon para sa isang app sa iOS at walang limitasyong bilang sa Android. Ang pagkakaiba ay nauugnay sa mga limitasyon ng arkitektura ng mga operating system.
Ang parehong platform ay nagbibigay ng kanilang sariling mga API para sa pagtatrabaho sa mga lokal na notipikasyon. Sa iOS ang sentral na elemento ay UNUserNotificationCenter, sa Android — NotificationManager. Sa kabila ng magkakaibang interface, pareho ang lohika: ang app ay lumilikha ng kahilingan, nagrehistro nito sa system, at inihahatid ng OS ang notipikasyon sa itinakdang oras.
Ang iOS ay gumagamit ng UNCalendarNotificationTrigger para sa mga kaganapan sa kalendaryo, UNTimeIntervalNotificationTrigger para sa mga interval, at UNLocationNotificationTrigger para sa geolokasyon. Ang Android ay nag-aalok ng AlarmManager, WorkManager, at tumpak na pag-iiskedyul sa pamamagitan ng setExact.
Mula sa Android 12 — ang SCHEDULE_EXACT_ALARM ay nangangailangan ng espesyal na pahintulot mula sa user. Sa iOS ang pahintulot ay hinihiling nang isang beses sa pamamagitan ng UNUserNotificationCenter.requestAuthorization, at pinipili ng user ang antas ng access: mga banner, tunog, badge.
Ang mga lokal na notipikasyon ay inuuri ayon sa uri ng trigger, hindi ayon sa nilalaman. Ang bawat uri ay tumutukoy kung kailan at sa ilalim ng anong mga kondisyon ipapakita ang notipikasyon sa user.
Sa iOS at Android ang mga uri ng trigger ay naipatupad nang iba, kahit na ang lohikal na pag-uuri ay pareho. Ang iOS ay gumagamit ng UNCalendarNotificationTrigger para sa mga petsa, UNTimeIntervalNotificationTrigger para sa mga interval, at UNLocationNotificationTrigger para sa geolokasyon. Ang Android ay nag-aalok ng AlarmManager na may setExact at setRepeating, at WorkManager para sa mga naantalang gawain.
| Uri ng trigger | Paglalarawan | Halimbawa |
|---|---|---|
| Interval ng oras | Notipikasyon pagkatapos ng N segundo mula sa pagsisimula | Timer ng countdown |
| Petsa ng kalendaryo | Notipikasyon sa tiyak na oras at petsa | Paalala ng pulong |
| Geolokasyon | Notipikasyon sa pagpasok/paglabas ng lugar | Paalala malapit sa tindahan |
| Walang kondisyon | Agad na paghahatid sa pagtawag ng API | Notipikasyon ng pag-download |
Sa iOS ay available din ang UNNotificationAttachment — attachment ng larawan, audio, o video sa katawan ng notipikasyon. Ang Android ay sumusuporta sa custom na template na may mga button at malalaking larawan sa pamamagitan ng NotificationCompat.Style.
Ang pagpili ng trigger ay depende sa sitwasyon: ang mga paalala sa kalendaryo ay pinakamahusay na gumagana sa pamamagitan ng trigger ng kalendaryo, at mga geo-paalala — sa pamamagitan ng geolokasyon. Ang mga interval trigger ay angkop para sa regular na mga kaganapan na may nakapirming panahon.
Sa iOS ang mga lokal na notipikasyon ay inihahatid ng system kahit na sarado ang app — pinamamahalaan ng UNUserNotificationCenter ang pila nang nakapag-iisa. Sa Android ang paghahatid ay depende sa napiling mekanismo: ang AlarmManager ay nag-a-activate kahit na naka-off ang screen, at ang WorkManager — na isinasaalang-alang ang pagtitipid ng enerhiya.
Ang mga lokal na notipikasyon ay lumulutas ng mga gawain kung saan ang panlabas na imprastraktura ay labis o hindi available. Mga pangunahing sitwasyon: mga paalala, timer, mga tip sa pag-aaral, at mga naantalang aksyon.
Ang pananaliksik ng Localytics ay nagpapakita na ang mga app na gumagamit ng lokal na paalala ay nagpapanatili ng 35% mas maraming user sa unang linggo pagkatapos ng pag-install. Ginagawa nitong makapangyarihang tool para sa onboarding ang mga lokal na notipikasyon.
Mahalagang huwag abusuhin ang dalas — ang system mismo ay nag-grupo ng mga notipikasyon mula sa isang app, at maaaring i-off ng user ang lahat ng lokal na notipikasyon kung nakakaabala ang mga ito. Ang pinakamainam na dalas ay hindi hihigit sa 2–3 notipikasyon bawat araw para sa hindi kritikal na mga kaganapan.
Para mag-iskedyul ng lokal na notipikasyon sa Android gamitin ang NotificationManager kasama ng AlarmManager. Mula sa Android 8+ kailangan munang gumawa ng channel ng notipikasyon, kung hindi hindi maipapakita ang notipikasyon.
val channelId = "reminder_channel"
val notificationId = "task_reminder_42"
val channel = NotificationChannel(
channelId,
"Mga paalala",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "Channel para sa mga paalala ng gawain"
}
val manager = getSystemService(NotificationManager::class.java)
manager.createNotificationChannel(channel)
val intent = Intent(this, ReminderReceiver::class.java).apply {
putExtra("notification_id", notificationId)
putExtra("channel_id", channelId)
}
val pendingIntent = PendingIntent.getBroadcast(
this, notificationId.hashCode(),
intent, PendingIntent.FLAG_UPDATE_CURRENT
)
val alarmManager = getSystemService(AlarmManager::class.java)
alarmManager.setExact(
AlarmManager.RTC_WAKEUP,
triggerTimeMillis,
pendingIntent
)
Sa Android 12+ suriin ang pahintulot na SCHEDULE_EXACT_ALARM bago tawagan ang setExact. Kung hindi ipinagkaloob ang pahintulot — gamitin ang setWindow na ginagarantiyahan ang paghahatid sa loob ng window ng oras.
Kapag nag-activate ang AlarmManager, ang system ay nagpapadala ng broadcast Intent na tinatanggap ng BroadcastReceiver. Sa loob nito kinakailangang lumikha at magpakita ng notipikasyon sa pamamagitan ng NotificationManager. Tiyakin na ang PendingIntent ay gumagamit ng FLAG_UPDATE_CURRENT, kung hindi kapag nagbago ang data ang mga lumang notipikasyon ay patuloy na gagamit ng lumang Intent.
Sa iOS ang mga lokal na notipikasyon ay ginagawa sa pamamagitan ng UNUserNotificationCenter gamit ang UNMutableNotificationContent at isa sa mga trigger. Bago mag-iskedyul kailangang humingi ng pahintulot sa user.
import UserNotifications
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
guard granted else { return }
}
let content = UNMutableNotificationContent()
content.title = "Paalala ng gawain"
content.body = "Huwag kalimutang tapusin ang ulat bago mag-18:00"
content.sound = .default
content.userInfo = ["task_id": "42"]
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 3600,
repeats: false
)
let request = UNNotificationRequest(
identifier: "task_reminder_42",
content: content,
trigger: trigger
)
center.add(request)
Ang iOS ay sumusuporta ng hanggang 64 na sabay-sabay na kahilingan para sa lokal na notipikasyon. Kung lumampas sa limitasyon — tinatanggihan ng system ang mga bagong kahilingan hanggang sa maihatid o makansela ang mga aktibong kahilingan. Gamitin ang getPendingNotificationRequests para suriin ang kasalukuyang pila.
Kapag nakipag-ugnayan ang user sa isang lokal na notipikasyon sa iOS, tinatawag ang pamamaraang userNotificationCenter:didReceive response ng delegadong UNUserNotificationCenterDelegate. Sa pamamaraang ito ay available ang identifier ng kahilingan, actionIdentifier (aling button ang pinindot), at custom na userInfo. Pinapayagan nitong makilala ang simpleng pagbubukas ng notipikasyon mula sa pagpindot ng tiyak na button ng aksyon.
Upang maging kapaki-pakinabang ang mga lokal na notipikasyon at hindi makainis sa user, sundin ang ilang pangunahing panuntunan. Una: kontrolin ang dalas — hindi hihigit sa 2–3 notipikasyon bawat araw para sa hindi kritikal na mga kaganapan, kung hindi ay i-off ng user ang lahat ng notipikasyon ng app.
Ikalawa: bigyan ng pagpipilian ang user. Magdagdag sa interface ng kakayahang i-off ang ilang uri ng lokal na notipikasyon. Sa Android para dito ay gamitin ang hiwalay na NotificationChannel na may mababang importance, sa iOS — hiwalay na kategorya sa mga setting ng app.
Ikatlo: kontekstwal na kaugnayan — ang notipikasyon ay dapat lumitaw kapag kailangan ito ng user. Ang mga geo-trigger ay perpekto para sa mga paalala ng mga gawain malapit sa bahay, mga trigger ng kalendaryo — para sa mga pulong, mga interval trigger — para sa regular na mga aksyon tulad ng pag-inom ng tubig o pag-stretch. Huwag paghaluin ang mga uri nang hindi kinakailangan.
Ikaapat: subukan sa mga totoong device. Hindi ginagaya ng iOS simulator ang lahat ng sitwasyon ng paghahatid ng lokal na notipikasyon, lalo na sa background. Sa Android gamitin ang adb shell dumpsys notification para suriin ang pila ng mga naka-iskedyul na notipikasyon at ang kanilang mga parameter. Ikalima: palaging bigyan ang user ng kakayahang i-off ang mga notipikasyon sa pamamagitan ng interface ng app — ito ay sapilitang kinakailangan ng UX at App Store Review Guidelines.
Mga Madalas Itanong
Ang lokal na notipikasyon ay pinaplano at inihahatid ng device nang walang partisipasyon ng server. Ang push notification ay nangangailangan ng panlabas na serbisyo (FCM, APNS) at koneksyon sa internet. Ang mga lokal ay gumagana offline, push — lamang kapag may access sa network.
Ang iOS ay naglilimita sa 64 sabay-sabay na naka-iskedyul na kahilingan. Ang Android ay walang mahigpit na limitasyon, ngunit higit sa 500 notipikasyon ay maaaring magpababa ng pagganap ng system at makaapekto sa oras ng paghahatid.
Oo, sa iOS gamitin ang removePendingNotificationRequests na may identifier ng kahilingan. Sa Android tawagan ang NotificationManager.cancel o kanselahin ang PendingIntent sa pamamagitan ng AlarmManager. Ang natatanging identifier ay sapilitan para sa pagkansela.
Sa iOS ang pahintulot ay sapilitang hinihingi sa pamamagitan ng requestAuthorization. Sa Android 13+ (Tiramisu) ay kinakailangan din ang pahintulot na POST_NOTIFICATIONS. Ang mga mas lumang bersyon ng Android ay hindi nangangailangan ng tahasang pahintulot para sa lokal na notipikasyon.
Sa iOS lumikha ng UNNotificationAction at idagdag sa UNNotificationCategory. Sa Android gamitin ang NotificationCompat.Builder.addAction na may PendingIntent para sa BroadcastReceiver. Ang bawat button ay nagti-trigger ng hiwalay na aksyon sa app.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din