😤
기능: alert 경고 표시, sound 소리 재생, badge app icon 아이콘 배지 표시
사용자가 원하는 중요한 정보를 전달하기 위해 사용!
앱이 실행되지 않았거나, 백그라운드: 시스템이 대신 사용자와 상호작용
앱이 포그라운드: 시스템은 앱에 알림 전달
let content = UNMutableNotificationContent()
content.title = "Weekly Staff Meeting"
content.body = "Every Tuesday at 2pm"
ex) 달력기반 트리거를 사용하려면, 배달 날짜, 시간을 지정해야 함
-> 매주 화요일 오후 2시에 알림 울리게 해줘
// Configure the recurring date.
var dateComponents = DateComponents()
dateComponents.calendar = Calendar.current
dateComponents.weekday = 3 // Tuesday
dateComponents.hour = 14 // 14:00 hours
// Create the trigger as a repeating event.
let trigger = UNCalendarNotificationTrigger(
dateMatching: dateComponents, repeats: true)
내용과 트리거 조건을 포함하는 개체를 생성하고, 메서드를 호출하여 시스템에 대한 요청을 예약한다.
// Create the request
let uuidString = UUID().uuidString
let request = UNNotificationRequest(identifier: uuidString,
content: content, trigger: trigger)
// Schedule the request with the system.
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.add(request) { (error) in
if error != nil {
// Handle any errors.
}
}
로컬 노티를 요청하는걸로, 내용이랑 전달 조건을 포함합니당
UNNotificationContent
UNNotificationTrigger
노티 예약하려면, request object를 add(_:withCompletionHandler:)에 넘깁니다!
request를 만들었다면, 객체와 인터랙트하는디
앱의 임시 노티를 보고 싶어 -> getPendingNotificationRequests(completionHandler:)
시스템이 앱으로 노티 전달 -> UNNotification - UNNotificationRequest object로 디테일 보기
알림센터로부터 노티 지우고 싶어 -> identifier
LocalNotificationManager
import Foundation
import UserNotifications
struct Notification {
var id: String
var title: String
}
class LocalNotificationManager {
var notifications = [Notification]()
func requestPermission() -> Void {
UNUserNotificationCenter
.current()
.requestAuthorization(options: [.alert, .badge, .alert]) { granted, error in
if granted == true && error == nil {
//we have permission!
}
}
}
func addNotification(title: String) -> Void {
notifications.append(Notification(id: UUID().uuidString, title: title))
}
func schedule() -> Void {
UNUserNotificationCenter.current().getNotificationSettings { settings in
switch settings.authorizationStatus {
case .notDetermined:
self.requestPermission()
case .authorized, .provisional:
self.scheduleNotifications()
default:
break
}
}
}
func scheduleNotifications() -> Void {
for notification in notifications {
//🗓️ 날짜 설정
var dateComponents = DateComponents()
dateComponents.calendar = Calendar.current
dateComponents.weekday = 4 // Wednesday
dateComponents.hour = 19 // 14:00
let content = UNMutableNotificationContent()
content.title = notification.title
content.sound = UNNotificationSound.default
content.subtitle = "약 먹을 시간이에요.💊"
content.body = "먹었다고 체크하기"
content.summaryArgument = "summary argument"
content.summaryArgumentCount = 40
// let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
let request = UNNotificationRequest(identifier: notification.id, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
guard error == nil else { return }
print("scheduling notification with id:\(notification.id)")
}
}
}
}
View
import SwiftUI
struct ContentView: View {
func setNotification() -> Void {
let manager = LocalNotificationManager()
manager.requestPermission()
manager.addNotification(title: "")
manager.schedule()
// manager.scheduleNotificaitons()
}
var body: some View {
VStack {
Button(action: { self.setNotification()
}) {
Text("Noti!")
}
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
정확한 시간에 울리게 해보았읍니다
🥹
레퍼런쓰
https://developer.apple.com/documentation/usernotifications/scheduling_a_notification_locally_from_your_app
https://velog.io/@j_aion/SwiftUI-Local-Notifications
https://2unbini.github.io/%F0%9F%93%82%20all/swift/swiftUI-Local-Notification/