Published on

SwiftUI-da Local Push Notification-larni rejalashtirish

Authors

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

TriggerIshlatilishi
UNTimeIntervalNotificationTriggerN soniya/daqiqadan keyin
UNCalendarNotificationTriggerSoat, kun, hafta kuni asosida
UNLocationNotificationTriggerJoylashuvga 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.

Buy mea coffee