- Published on
SwiftUI-da Local Push Notification-larni rejalashtirish
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
Bu video texnik jihatdan SwiftUI-ga to'g'ridan-to'g'ri bog'liq emas, lekin SwiftUI ilovalari uchun muhim mavzu — Local Notification (mahalliy bildirishnomalar).
Local va Remote Notification farqi
Local Notification — ilovaning o'zi tomonidan rejalashtiriladigan bildirishnoma. Masalan, har kuni soat 17:00 da eslatma yuborish — bu ma'lumot ilovada mavjud, server kerak emas.
Remote (Push) Notification — serverdan keladi. Masalan, kimdir fotosuratni like qilganda bildirishnoma yuborish — bu qachon sodir bo'lishini ilova bilmaydi, server lozim.
Hozircha faqat local notification ko'rib chiqiladi — server kerak emas va o'rganish ancha oson.
Uchta trigger turi
1. Time (vaqt) — N soniya/daqiqadan keyin
2. Calendar (taqvim) — har kuni soat 17:00, har dushanbada va hokazo
3. Location (joylashuv) — foydalanuvchi muayyan joyga kirsa yoki chiqsa
Boshlang'ich ekran
struct LocalNotificationBootcamp: View {
var body: some View {
VStack(spacing: 40) {
Button("Ruxsat so'rash") {
NotificationManager.instance.requestAuthorization()
}
Button("Bildirishnoma rejalashtirish") {
NotificationManager.instance.scheduleNotification()
}
Button("Bildirishnomani bekor qilish") {
NotificationManager.instance.cancelNotifications()
}
}
.onAppear {
// Ilova ochilganda badge raqamini nolga tushirish
UIApplication.shared.applicationIconBadgeNumber = 0
}
}
}
NotificationManager — Singleton
import UserNotifications
import CoreLocation
class NotificationManager {
// Singleton — bitta instance, butun ilova bo'ylab ishlatiladi
static let instance = NotificationManager()
// ...
}
1. Ruxsat so'rash
Bildirishnoma yuborishdan oldin foydalanuvchidan ruxsat olish shart. Bu — ilovada birinchi marta ko'rinadigan "... bildirishnoma yubormoqchi" dialog oynasi.
func requestAuthorization() {
let options: UNAuthorizationOptions = [.alert, .sound, .badge]
// .alert — bildirishnoma oynasi
// .sound — ovoz
// .badge — ilova ikonasidagi raqam
UNUserNotificationCenter.current().requestAuthorization(options: options) { success, error in
if let error = error {
print("Xato: \(error)")
} else {
print("Muvaffaqiyat: \(success)")
}
}
}
Ruxsat bir marta so'raladi — qurilma javobni eslab qoladi. Qayta so'rashda dialog oynasi chiqmaydi, faqat avvalgi javob qaytariladi. Ruxsatni qayta sozlash uchun ilovani o'chirib qayta o'rnatish kerak.
2. Bildirishnoma mazmunini sozlash
func scheduleNotification() {
let content = UNMutableNotificationContent()
content.title = "Bu mening birinchi bildirishnomam"
content.subtitle = "Bu juda oson bo'ldi"
content.sound = .default
content.badge = 1 // ilova ikonasida ko'rsatiladigan raqam
// ...
}
3. Trigger — qachon yuborilsin
Time trigger — N soniyadan keyin
// 5 soniyadan keyin bir marta
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 5.0,
repeats: false
)
// Har daqiqada takrorlansin (repeats: true bo'lsa minimum 60 soniya)
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 60.0,
repeats: true
)
Calendar trigger — muayyan vaqtda
// Har kuni soat 20:26 da
var dateComponents = DateComponents()
dateComponents.hour = 20 // soat (24 soatlik format)
dateComponents.minute = 26
let trigger = UNCalendarNotificationTrigger(
dateMatching: dateComponents,
repeats: true // har kuni takrorlanadi
)
// Har dushanba kuni soat 08:00 da
var dateComponents = DateComponents()
dateComponents.weekday = 2 // 1=yakshanba, 2=dushanba, ..., 7=shanba
dateComponents.hour = 8
dateComponents.minute = 0
let trigger = UNCalendarNotificationTrigger(
dateMatching: dateComponents,
repeats: true
)
DateComponents-da boshqa sozlamalar ham mavjud: day (oy kuni), month, weekOfMonth va boshqalar — kombinatsiyalar cheksiz.
Location trigger — joylashuvga qarab
import CoreLocation
let coordinates = CLLocationCoordinate2D(
latitude: 40.00,
longitude: 50.00
)
let region = CLCircularRegion(
center: coordinates,
radius: 100, // metr — bu markazdan 100 metr radius
identifier: UUID().uuidString
)
region.notifyOnEntry = true // kirganida bildirishnoma
region.notifyOnExit = false // chiqqanida bildirishnoma yo'q
let trigger = UNLocationNotificationTrigger(
region: region,
repeats: true
)
Bu trigger foydalanuvchi belgilangan geografik hududga kirganida yoki chiqqanida ishga tushadi. Masalan: qahvaxona ilovasi, mijoz do'konga kirganida avtomatik bildirishnoma yuborishi uchun.
4. So'rovni yuborish
func scheduleNotification() {
let content = UNMutableNotificationContent()
content.title = "Bu mening birinchi bildirishnomam"
content.subtitle = "Bu juda oson bo'ldi"
content.sound = .default
content.badge = 1
// Trigger tanlanadi (time, calendar yoki location)
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 5.0,
repeats: false
)
let request = UNNotificationRequest(
identifier: UUID().uuidString, // kuzatish kerak bo'lsa aniq ID
content: content,
trigger: trigger
)
UNUserNotificationCenter.current().add(request)
}
Muhim: Bildirishnomalar faqat ilova fonda turganida ko'rinadi. Ilova ochiq bo'lsa — bildirishnoma oynasi chiqmaydi.
5. Badge raqamini boshqarish
Bildirishnoma kelganda ilova ikonasida raqam paydo bo'ladi. Ilova ochilganda buni nolga tushirish kerak:
.onAppear {
UIApplication.shared.applicationIconBadgeNumber = 0
}
6. Bildirishnomalarni bekor qilish
func cancelNotifications() {
// Hali kelmaganllarni bekor qilish
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
// Notification Center-da ko'rinib turganlarni o'chirish
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
}
To'liq NotificationManager
import UserNotifications
import CoreLocation
class NotificationManager {
static let instance = NotificationManager()
func requestAuthorization() {
let options: UNAuthorizationOptions = [.alert, .sound, .badge]
UNUserNotificationCenter.current().requestAuthorization(options: options) { success, error in
if let error = error {
print("Xato: \(error)")
} else {
print("Muvaffaqiyat: \(success)")
}
}
}
func scheduleNotification() {
let content = UNMutableNotificationContent()
content.title = "Bu mening birinchi bildirishnomam"
content.subtitle = "Bu juda oson bo'ldi"
content.sound = .default
content.badge = 1
// TIME trigger
let trigger = UNTimeIntervalNotificationTrigger(
timeInterval: 5.0,
repeats: false
)
// CALENDAR trigger (izoh qilib qo'yilgan)
// var dateComponents = DateComponents()
// dateComponents.hour = 20
// dateComponents.minute = 26
// let trigger = UNCalendarNotificationTrigger(
// dateMatching: dateComponents,
// repeats: true
// )
// LOCATION trigger (izoh qilib qo'yilgan)
// let coordinates = CLLocationCoordinate2D(latitude: 40.00, longitude: 50.00)
// let region = CLCircularRegion(center: coordinates, radius: 100, identifier: UUID().uuidString)
// region.notifyOnEntry = true
// region.notifyOnExit = false
// let trigger = UNLocationNotificationTrigger(region: region, repeats: true)
let request = UNNotificationRequest(
identifier: UUID().uuidString,
content: content,
trigger: trigger
)
UNUserNotificationCenter.current().add(request)
}
func cancelNotifications() {
UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
}
}
Xulosa
| Trigger | Ishlatilishi |
|---|---|
UNTimeIntervalNotificationTrigger | N soniya/daqiqadan keyin |
UNCalendarNotificationTrigger | Soat, kun, hafta kuni asosida |
UNLocationNotificationTrigger | Joylashuvga kirish/chiqish paytida |
Local notification — serverga muhtoj bo'lmasdan professional bildirishnoma tajribasini ta'minlaydi. Ayniqsa Calendar trigger — har kuni yoki haftada bir eslatma yuborish uchun juda qulay va keng qo'llaniladi.