본문 바로가기
개린이 이야기

Local Notification(로컬 푸쉬 알림)

by iOS 개린이 2022. 12. 7.

달력 일정 어플을 만드는 중에 기록해둔 일정의 날짜가 다가오면 알림을 보내주는 기능을 만들려고 한다.

Firebase를 베이스로 한 어플이기 때문에 FCM을 사용하면 되나? 라고 생각했다.

질문해보니 FCM은 외부에서 디바이스로 푸쉬를 넣어주는 기능이고, 일정 알림은 보통 Local Notification을 사용한다고 한다.

 

Local Notification을 시작해보자.

 

Local Notification

-외부 네트워크를 거치지 않고 기기 내부에서 발신하는 푸시 알림이다.

-UserNotification 프레임 워크에서 제공하는 기능이므로 import UserNotifications 해야 한다.

 

-크게 Content, Trigger, Request, Center 4가지로 구성되어 있다.

 

1. Content : 사용자에게 어떤 컨텐츠를 보여줄 지 구성하는 부분으로 title, body, badge number, userInfo, attachments 등이 있다.

 

2. Trigger : 어떤 조건으로 알림이 실행되는 지 구성하는 부분으로 time, calendar, location 이렇게 3가지 타입이 있다.

time은  일정 시간이 지난 후에 작동

calendar는 특정 날짜에 작동

location은 특정 위치에 진입하거나 나갈 때 작동

 

3. Request : 위에서 작성한 Content와 Trigger를 이용하여 알림 요청 객체를 생성한다. identifier를 지정해주고 후에 푸시 알림을 조정해야 할 때 사용한다. 

 

4. Center : 알림 요청 객체가 등록이 되면 발송을 해주는 역할이다.

 

Local Notification 구현 순서

먼저 import UserNotifications 해주고

 

1. 유저에게 앱 알림 권한 요청

2. UNMutabelNotificationContent(Content)에 푸시 알림 메시지에 들어가는 title, body, 소리 등을 추가한다.

3. 어떤 타입으로 Trigger할 것인지 정한다.

4. content와 trigger를 바탕으로 푸시 메시지를 등록한다.

5. 푸시 메시지를 클릭하면 어떤 reAction을 할 것인지 작성.

 

1. 유저에게 앱 알림 권한요청

처음 앱에 접속할 때 바로 알림 권한을 요청할 수 있도록 AppDelegate의 didFinishLaunchingWithOptions메소드에서 실행한다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
    let notificationCenter = UNUserNotificationCenter.current()   //알림 발송해주는 center 생성
    let notificationOptions = UNAuthorizationOptions(arrayLiteral: [.alert, .badge, .sound]) //어떤 옵션들을 메시지 알림에 넣는지
        
    notificationCenter.requestAuthorization(options: notificationOptions) { didAllow, error in
        if let e = error {
             print("Error Cofigure request notification\(e)")
        }
    }
        
    return true
}

코드에서 생성한 UNAuthorizationOptions에는 alert, badge, sound 외에도 여러 가지가 있습니다. 

https://developer.apple.com/documentation/usernotifications/unauthorizationoptions 이곳을 확인.

 

2. Content 작성

let notificationContent = UNMutableNotificationContent()

notificationContent.title = "오늘의 일정"
notificationContent.body = "빨래하기, 청소하기"
notificationContent.badge = 1
notificationContent.sound = .default
notificationContent.userInfo = ["오늘일정" : "빨래하기"]  //푸시메시지에 담고 싶은 정보

userInfo는 푸시 메시지에 정보를 담을 수 있는 Dictionary형태로 후에 메시지를 클릭했을 때 key를 통해 저장해둔 정보를 가져올 수 있다.

 

3. Trigger 작성

var component = calendar.dateComponents([.year, .month, .day], from: Date())
component.hour = 14
component.minute = 30
component.second = 0

let notificationTrigger = UNCalendarNotificationTrigger(dateMatching: component, repeats: false)

위에서 말했듯이 time, calendar, location 세 가지 타입이 있는데 일정 관리는 date를 통해 알림을 주어야 해서 UNCalendarNotificationTrigger를 사용했다. 

 

4. Request 작성 후 푸시 메시지 등록

let request = UNNotificationRequest(identifier: "scheduleNotification", content: notificationContent, trigger: notificationTrigger)
        
notificationCenter.add(request) { error in
    if let e = error {
        print("Error send message \(e)")
    }else{
        print("sccess")
    }
}

 

5. 메시지 클릭하면 나오는 Reaction

notificationCenter.delegate = self

extension AppDelegate : UNUserNotificationCenterDelegate {
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        
        let identifier = response.notification.request.identifier
        let userInfo = response.notification.request.content.userInfo
        
        print("identifier : \(identifier)")
        print("userInfo : \(userInfo)")
        
        completionHandler()
    }
}

delegate를 채택하고 didReceive 메서드를 통해 클릭 시 취해야 할 행동에 대해 지정해준다.

 

 

 

 

 

 

 

 

참고:

Swift(스위프트): Local Notification (로컬 푸시 메시지, 오프라인 푸시 메시지) - BGSMM (yoonbumtae.com)[iOS] 로컬 푸쉬 알림 구현 방법 (Local Notification) (tistory.com)

[Swift 개발] Local Notification 사용하기 (tistory.com)