달력 일정 어플을 만드는 중에 기록해둔 일정의 날짜가 다가오면 알림을 보내주는 기능을 만들려고 한다.
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)
'개린이 이야기' 카테고리의 다른 글
Google AdMob(애드몹)에 관하여 (0) | 2023.01.15 |
---|---|
With Calendar 프로젝트를 하면서 (0) | 2023.01.09 |
URLSession에 관하여 (0) | 2022.11.25 |
함수형 프로그래밍에 관하여 (0) | 2022.10.09 |
ARC(Auto Reference Counting)에 관하여 (0) | 2022.09.27 |