티스토리 뷰

UNUserNotificationCenterDelegate를 상속해주세요.

UNUserNotificationCenter가 필요하고

noti 허가를 위한 request를 해야합니다.

 

UNNotificationContent에서는 알림 내용을 설정할 수 있습니다.

 

Trigger에는 다양한 종류가 있습니다.

 

저는 UNCalendarNotificationTrigger를 사용했는데요. 정확한 날짜와 시간에 맞게 알람을 보내야하기 때문입니다.

만약에 60분 후에 알람이 울려야한다면 timeInterval에 60*60을 넣어서 간단하게 설정할 수도 있겠네요.

 

UNCalendarNotificationTriggerDateComponents를 만들어야합니다.

let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: date)

Set<Calendar.Component> 부분에 필요한 값을 선택적으로 넣어주시면 됩니다.

그리고 from에는 제가 원하는 Date를 넣어주시면 됩니다.

 

UNNotificationPresentationOptions이 iOS14부터 .alert가 사라졌습니다.

list와 banner가 정확이 어떤건지 문서에는 안나와있습니다.

 

아래는 추측한 내용입니다.

banner는 .alert와 동일합니다.

list는 banner와 비슷하지만 앱이 켜져있을 때(foreground)에서는 push notification이 나타나지 않습니다.

list와 banner둘다 foreground 에서 local notification은 나타나지 않습니다.

(이 부분에 오류가 있으면 댓글로 알려주세요.)

 

 

 

전체코드

import UIKit
import UserNotifications

class AddToDoVC: UIViewController {
    
    let userNotificationCenter = UNUserNotificationCenter.current()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        userNotificationCenter.delegate = self
        requestAuthorization()
    }
   
    func requestAuthorization() {
        let options = UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound)
        userNotificationCenter.requestAuthorization(options: options) { success, error in
            if let error = error {
                print(error)
            }
        }
    }
    
    func sendNotification() {
        let notiContent = UNMutableNotificationContent()
        let date = Date()
        notiContent.title = "title"
        notiContent.body = "body"

        let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: date)
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
        let request = UNNotificationRequest(identifier: "LocalNoti", content: notiContent, trigger: trigger)

        userNotificationCenter.add(request) { error in
            if let error = error {
                print(error)
            }
        }
    }

    
}

extension AddToDoVC: UNUserNotificationCenterDelegate {
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        completionHandler()
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.list, .badge, .sound, .banner])
        //        completionHandler([.alert, .badge, .sound])
    }
}
댓글
공지사항