벌써 4주차 끝...
시간이 너무 빠르다
4개월 밖에 남지 않았다
더 열심히 하자
Notification
Notification? iOS는 보안이 강력하고 철저하기로 유명하다
iPhone 유저라면 App 실행 전 항상 권한 요청을 받아 본 경험이 있을 것이다
alert, sound , badge등의 알림을 받으려면 User의 권한 허용이 무조건 필요하다
Notification은 서버에서 보내는 것과 앱 내부에서 보내는 것으로 나뉜다
Remote Notification
App Store에서 다운로드 받은 앱들에서 알림을 받아 본 경험이 있을 것이다
서버에서 기기로 알림을 보내는 방식이다
Local Notification과는 달리 보내는 시간과 내용이 일정하지 않다
LocalNotification
앱 내부에서 기기로 알림을 보내는 방식
일정, 미리알림 같은 기본 App 등에서 알림 보내는 형태
비슷한 시간과 내용의 형태로 알림을 보낸다
들어가기 앞서, Notification 구조를 알아야 이해가 쉽다
1. Authorization (권한 요청)
-> alert, badge, sound등 권한을 요청한다
2. Content 설정
-> 알림의 형태를 설정한다
-> title, subtitle, body, badge
3. Trigger 설정
-> 알림을 보내는 간격 어떤 기준으로 알림을 보낼 것인가 정해준다
Authorization
let notificationCenter = UNUserNotificationCenter.current()
UNUserNotificationCenter 인스턴스 생성
func requestAuthorization() {
let authorizationOptions = UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound)
//bool error 유저가 권한을 허용했냐 안했냐 에러 났을때 어떻게 할거냐
notificationCenter.requestAuthorization(options: authorizationOptions) { success, error in
//함수안에 함수가 들어있는 상황 클래스가 가지고 있는 인스턴스를 호출해달라 그래서 self
//알람 권한 보냄
if success {
self.sendNotificaiton()
}
}
}
Closure를 살펴보면 성공했을 경우에만 App이 시작했을 때 허용을 할지에 대한 알림을 보낼 것이다
Content 설정
let notificationContents = UNMutableNotificationContent()
notificationContents.title = "다마고치를 키워보세요"
notificationContents.subtitle = "오늘 행운의 숫자는 \(Int.random(in: 1...100))입니다"
notificationContents.body = "저는 따끔따끔 다마고치입니다. 배고파요."
//뱃지영역에 40뜸
notificationContents.badge = 40
title, subtitle, body, badge 설정 해주었다
Trigger 설정
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
var dateComponents = DateComponents()
//해당 분에 해당하는 반복
dateComponents.minute = 15
//알림요청
let request = UNNotificationRequest(identifier: "Daniel" , content: notificationContents, trigger: trigger)
//"\(Date())" -> 스택 쌓임 알림 관리 필요없이 stack 쌓임
notificationCenter.add(request)
시간, 날짜, 위치 등을 간격을 지정할 수 있다
또한 로컬 알림 요청이 가능하다
고려 사항
1) Badge 제거
메신저 앱의 경우 Badge가 쌓였을 때 해당 앱을 들어가서 Badge 알림을 보내는 메신저로 들어가면 Badge는 사라진다
이러한 기능을 구현하려면 SceneDelegate에서 구현해주어야한다
func sceneDidBecomeActive(_ scene: UIScene) {
//Bedge 제거
// active 상태에서 벳지 사라짐 언제 쓰는지를 알자
//appdelegate에서 didfinish에서 쓰면 terminate 되어지지 않는 이상 벳지는 없어지지 않는다
UIApplication.shared.applicationIconBadgeNumber = 0
}
SceneDelegate에서 sceneDidBecomeActive에서 사용
-> inactive 한 경우나 App이 Background에 갈 경우 Badge가 사라지지 않는 경우가 발생할 수 있기 때문에 AppDelegate의 didFinisih에서는 구현을 하지 않는다
-> 카카오톡의 경우 카카오톡을 킨 후 메세지가 온 곳을 들어가야 Badge가 사라진다 이 경우를 구현하려면 더 생각 해보아야한다
2) Noti 제거
알림 쌓인 것을 앱이 켜질 때 한번에 제거 AppDelegate에서 구현한다
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
//2. 노티제거 //deliver와 Pending차이 이미 도달한거 deliver 사용자가 받을 예정인 pending deliveridentifier 특정 노티만 삭제
//알람의 경우 Pending 사용 효과적, 미리 알림, 스케줄 => 하루 전 알림 30분 전 알림 => todolist에 이미 했다고 체크하면 예약한 것까지 날림
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
UNUserNotificationCenter.current().delegate = self
return true
}
removeAllDeliveredNotification -> 디바이스에 도달한 모든 알림 제거
removeAllPendingNotificationRequests -> 예정된 알림 제거
-> 기준을 잡아주어야 한다(얼마나 오랜시간 남겨두어야하나)
3) Foreground
App내에서 기능 사용 중에 다른 App에서 알림이 오는 경험을 해봤을 것이다. AppDelegate에서 구현한다
//포그라운드 수신!
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.list, .banner, .badge, .sound])
//iOS14 list, banner <-> alert
}
iOS 14 이상 부터는 alert이 list와 banner로 명시해야한다
-> a라는 특정 App을 쓰고 있는데 동일한 a에서 알림이 오면 안된다 이 관점에서도 생각 해보아야 한다
'Tech > iOS' 카테고리의 다른 글
[iOS]Day 29 - Singleton Pattern (0) | 2022.08.01 |
---|---|
[iOS] Day 26 - Custom Font (0) | 2022.07.29 |
[iOS] Day 25 - Protocol (0) | 2022.07.28 |
[iOS] Day 25 - UIPickerView & WebView (0) | 2022.07.28 |
[iOS] Day 24 - Property Observer (0) | 2022.07.27 |