iOS에서 로컬 알림(Local Notification) 구현하기
기본 설정 및 권한 요청
먼저, 사용자가 앱에서 알림을 받을 수 있도록 권한을 요청해야 합니다. 이를 위해 UserNotifications 프레임워크를 사용합니다.
import UserNotifications
class LocalNotificationManager {
static let shared = LocalNotificationManager()
private let notificationCenter = UNUserNotificationCenter.current()
private override init() {
super.init()
notificationCenter.delegate = self
}
func requestAuthorization(completion: @escaping (Bool) -> Void) {
notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if let error = error {
print("Authorization request error: \\\\(error)")
}
DispatchQueue.main.async {
completion(granted)
}
}
}
}
이 코드에서는 LocalNotificationManager 클래스를 정의하고, 사용자에게 알림 권한을 요청하는 메서드 (requestAuthorization)를 구현합니다. iOS 10 이상에서는 UNUserNotificationCenter를 사용해 알림의 권한을 요청해야 합니다.
알림 예약
이제 권한 요청이 성공한 후 알림을 예약하는 방법을 알아보겠습니다. 특정 시간에 알림을 보내기 위해 시간을 설정하고, 알림 콘텐츠를 정의합니다.
func scheduleNotification(title: String, body: String, triggerDate: Date, identifier: String, completion: @escaping (Error?) -> Void) {
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.sound = .default
let components = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: triggerDate)
let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: false)
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
notificationCenter.add(request) { error in
DispatchQueue.main.async {
completion(error)
}
}
}
여기서는 알림 제목, 본문, 트리거 날짜, 식별자를 받아 UNMutableNotificationContent를 설정하고, UNCalendarNotificationTrigger를 사용하여 특정 시간에 알림을 발송합니다. 그런 다음 UNNotificationRequest를 생성하여 알림을 예약합니다.
알림 설정 예제
위에서 설명한 메서드를 사용하여 실제로 알림을 설정해봅시다. 예를 들어, 사용자가 특정 시간에 알림을 받도록 예약하는 기능을 구현해보겠습니다.
func setReminder(for date: Date) {
LocalNotificationManager.shared.requestAuthorization { granted in
if granted {
LocalNotificationManager.shared.scheduleNotification(
title: "Reminder",
body: "It's time for your task!",
triggerDate: date,
identifier: UUID().uuidString
) { error in
if let error = error {
print("Error scheduling notification: \\\\(error)")
} else {
print("Notification scheduled successfully.")
}
}
} else {
print("Notification permission not granted.")
}
}
}
이 함수는 사용자가 설정한 날짜에 알림을 예약합니다. requestAuthorization을 호출하여 사용자에게 알림 권한을 요청하고, 권한이 부여되면 scheduleNotification을 사용해 알림을 예약합니다.
알림의 현재 상태 확인 및 삭제
예약된 알림을 확인하거나 삭제하는 방법도 중요합니다. 이를 통해 필요하지 않은 알림을 삭제하거나, 예약된 알림을 사용자에게 보여줄 수 있습니다.
func getPendingNotifications(completion: @escaping ([UNNotificationRequest]) -> Void) {
notificationCenter.getPendingNotificationRequests { requests in
DispatchQueue.main.async {
completion(requests)
}
}
}
func removeAllPendingNotifications() {
notificationCenter.removeAllPendingNotificationRequests()
}
위 두 메서드를 통해 예약된 알림을 확인할 수 있으며, 모든 예약된 알림을 삭제할 수도 있습니다!