본문 바로가기
Swift

[iOS] About Local Notification

by dsungc 2024. 11. 13.

Local Notification

- 사용자 기기에서 발생하는 알림으로, 서버 없이 앱 내부에서 특정 이벤트 / 시간을 기반으로 알림 트리거 가능

- 인터넷 연결 없이도 동작하며, 앱 사용자에게 중요한 정보를 전달하는 데 유용함

 

 

 

로컬 알림의 주요 특징

 

1. 인터넷 연결 불필요

- 로컬 알림은 기기 내에서 트리거되므로 네트워크 연결 필요 없음

2. 앱 내부 이벤트 기반

- 특정 시간이나 이벤트에 따라 알림을 생성 가능

- 예를 들어, 특정 작업의 마감 알림이나 데일리 리마인더를 설정 가능

3. 제한된 컨트롤

- 앱이 백그라운드나 종료된 상태일 때는 알림만 표시 가능

 


로컬 알림 구현

(SwiftUI 기반으로 작성된 프로젝트입니다..!!)

 

1. 권한 요청

- 앱이 로컬 알림을 보내기 전에 사용자로부터 알림 권한 요청

import UserNotifications

final class NotificationManager {
    static let shared = NotificationManager()

    func requestNotificationPermission() {
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
            if let error = error {
                print("권한 허용 에러: \(error.localizedDescription)")
            }
            print("권한 허용 승인: \(granted)")
        }
    }
}

 

- options는 알림에 표시할 요소(배너, 사운드, 배지)를 지정

 

 

2. 알림 생성 및 트리거 설정

- 특정 시간 또는 이벤트에 맞춰 알림 생성

func scheduleDailyNotification() {
    let content = UNMutableNotificationContent()
    content.title = "미라클 모닝"
    content.body = "오늘 하루를 시작해보세요!"
    content.sound = .default

    // 매일 오전 5시에 알림
    var dateComponents = DateComponents()
    dateComponents.hour = 5
    dateComponents.minute = 0
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)

    let request = UNNotificationRequest(identifier: "dailyReminder", content: content, trigger: trigger)

    let center = UNUserNotificationCenter.current()
    center.add(request) { error in
        if let error = error {
            print("알림 설정 실패: \(error.localizedDescription)")
        }
    }
}

 

 

3. Foreground 알림 표시 설정

- iOS 기본 동작에서는 앱이 foreground 상태일 때 알림 표시 X

- 이를 해결하기 위해선 UNUserNotificationCenterDelegate 설정

class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
    func userNotificationCenter(
        _ center: UNUserNotificationCenter, 
        willPresent notification: UNNotification, 
        withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
    ) {
        completionHandler([.banner, .sound])
    }
}

 

- 설정 후, App delegate 에서 해당 delegate 설정

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        UNUserNotificationCenter.current().delegate = NotificationDelegate()
        return true
    }
}

 

 

4. 알림 권한 요청 및 트리거

- 앱 실행 시, 알림 권한 요청 하고 알림 스케줄 등록

@main
struct YourApp: App {
    init() {
        NotificationManager.shared.requestNotificationPermission()
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
                .onAppear {
                    NotificationManager.shared.scheduleDailyNotification()
                }
        }
    }
}

 

 

결과는..?

 

<권한 설정 알림>

 

<알림 화면>

 

<메인 화면>

 

 

성공!

.

.

.

.

'Swift' 카테고리의 다른 글

[iOS] About Kingfisher  (1) 2024.11.27
[iOS] About 채팅 UI  (0) 2024.11.20
[iOS] About 동시성  (0) 2024.11.10
[iOS] About WidgetKit - 2(App Group)  (0) 2024.11.02
[iOS] About TDD  (1) 2024.10.30