로컬 알림 처리하기
- 이전 포스팅에서 로컬 알림 발생하는 방법에 대해서 알아보았다
- 이번엔 해당 메세지를 처리하는 방법에 대해서 알아보겠다.
- 처리? 뭘 처리한다는거야? -> 휴대폰에 떠있는 이벤트 푸시 알림들을 터치해서 해당 앱을 들어가면 보통 홈 화면이 아닌 해당 이벤트를 공지해주는 화면으로 이동하게 된다. 이러한 동작을 하는 것이다.(물론 해당 푸시 알림들은 서버에서 보낸것이다)
쨋든...
알아보자
델리게이트 패턴
- UserNotification 프레임워크에서도 Delegate 패턴을 사용하여 처리한다.
//AppDelegate
//해당 동작을 위한 구현은 이전 포스팅 참고
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 10.0, *) {
let notiCenter = UNUserNotificationCenter.current()
notiCenter.requestAuthorization(options: [.alert, .badge, .sound], completionHandler: { _, _ in
})
//NotificationCenter의 대리자를 AppDelegate로
notiCenter.delegate = self
}else{
//9버전 이하
}
return true
}
알림 메시지 클릭 이벤트를 AppDelegate가 감지할 수 있게 되었다.
그렇다면 어떻게 처리할지? 에 대해서 정의하겠다.
App이 실행되는 도중 알림이 오는 경우, userNotificationCenter(_:willPresent:withCompletionHandler:) 메소드가 호출된다.
따라서 이 메소드를 구현하면 우리는 앱 실행 중 알림이 도착했는지를 알 수 있다.
해당 메소드를 구현하지 않는다면, 앱 실행 중 도착한 메시지는 배너로 표시되지 않는다.
사용자가 알림을 클릭하면 userNotificationCenter(_:didReceive:withCompletionHandler:) 메소드가 호출된다
따라서 앱이 실행 중이든 아니든, 사용자가 클릭했다는 것을 알 수 있다.
알림이 도착했을 때
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
if notification.request.identifier == "firstPush"{
let userInfo = notification.request.content.userInfo
print(userInfo["name"]!)
}
//알림 배너 띄워주기
completionHandler([.list, .badge, .sound])
}
}
마지막에 작성된 completionHandler()는 반드시 호출돼야 한다.
이를 생략하면 앱 실행 도중에 알림 배너는 표시되지 않는다.
print(userInfo["name"]) 은 이전에 직접 작성한 userInfo를 확인하기 위함이다.
사용자가 어떤 알림을 클릭했는지 식별하기 위해서 사용한다.
사용자가 알림을 클릭했을 때
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
if response.notification.request.identifier == "firstPush"{
let userInfo = response.notification.request.content.userInfo
print(userInfo["name"]!)
}
completionHandler()
}
위의 메소드와의 차이는 2번째 인자의 타입이 다르다는 것이다. 확인하고 사용하길 바란다.
'iOS' 카테고리의 다른 글
[iOS] init(frame:) 과 required init?(coder:) (0) | 2021.01.27 |
---|---|
[iOS] Delegate 패턴에 대해 알아보자 (0) | 2021.01.22 |
[iOS] Local Push Notification 로컬 알림 (0) | 2021.01.21 |
[iOS] NotificationCenter vs Delegate (0) | 2021.01.19 |
[iOS] Build input file cannot be found: '...../Info.plist' 오류 (0) | 2021.01.14 |