iOS developer essential skills
iOS 앱에서 로컬 푸시 알림(Local Push Notification)을 구현하는 방법은 무엇인가요?
jgkim1008
2024. 6. 24. 15:09
로컬 푸시 알림과 원격 푸시 알림(Remote Push Notification)의 차이점은 무엇인가요?
로컬 푸시 알림 (Local Push Notification)
- 로컬 푸시 알림은 앱이 실행 중이거나 백그라운드에서 로컬 데이터에 기반하여 알림을 생성하고 표시하는 방식
- 로컬 푸시 알림은 서버와의 통신이 필요 없으며, 주로 사용자의 기기 내에서 발생하는 이벤트나 일정에 따라 알림을 생성합니다.
- 사용 사례:
- 일정 알림: 캘린더 앱에서 사용자의 일정에 따라 알림을 설정.
- 타이머 또는 알람: 시간 경과에 따라 알림을 표시.
- 위치 기반 알림: 사용자가 특정 위치에 도달했을 때 알림을 트리거.
원격 푸시 알림 (Remote Push Notification)
원격 푸시 알림은 서버에서 생성되어 푸시 알림 서비스를 통해 사용자의 기기로 전달되는 알림이며 이 방식은 서버와의 통신이 필요
앱이 실행 중이 아니더라도 알림을 전송할 수 있습니다.
로컬 노티 전송 방법
import UserNotifications
import SwiftUI
@main
struct ContentView: View {
var body: some View { VStack { Text("test") } } .onAppear { scheduleLocalNotification() }
func scheduleLocalNotification() {
let content = UNMutableNotificationContent()
content.title = "Time to Check the App"
content.body = "It's time to see what's new!"
content.sound = .default
// Trigger after 10 seconds
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)
let request = UNNotificationRequest(identifier: "localNotification", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
print("Error scheduling local notification: \(error)")
}
}
}
}
- 원격 푸시 알림
- 아래 페이지 참고
푸시 알림의 콘텐츠(Content)와 트리거(Trigger)는 어떤 역할을 하나요?
- 컨텐츠
- 컨텐츠는 말 그대로 노티피케이션에 보여줄 컨텐츠
- 상단 코드 예시를 보면 title, body, sound, badge 를 설정할수 있다.
- 트리거
- 말 그대로 트리거 몇초뒤에, 반복 여부 등 을 설정할수 있다.
- request
- 위 컨텐츠와 트리거를 합하여 UNNotificationRequest를 보낸다.
사용자가 푸시 알림을 탭했을 때 앱의 동작을 처리하는 방법을 설명해주세요.
- UNUserNotificationCenterDelegate 의 delegate 메서드를 통해 처리하면 된다.
extension AppDelegate: UNUserNotificationCenterDelegate {
// Foreground에서 알림을 수신했을 때
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .badge, .sound])
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if UIApplication.shared.applicationState == .active || UIApplication.shared.applicationState == .inactive { // 앱이 켜져있는 상태에서 클릭시 (활성화/비활성화(잠깐 숨겨놓은 상태))
} else { // 앱이 꺼져있는 상태에서 클릭시 (백그라운드)
}
completionHandler()
}
}