로컬 알림 처리하기

- 이전 포스팅에서 로컬 알림 발생하는 방법에 대해서 알아보았다

- 이번엔 해당 메세지를 처리하는 방법에 대해서 알아보겠다.

- 처리? 뭘 처리한다는거야? -> 휴대폰에 떠있는 이벤트 푸시 알림들을 터치해서 해당 앱을 들어가면 보통 홈 화면이 아닌 해당 이벤트를 공지해주는 화면으로 이동하게 된다. 이러한 동작을 하는 것이다.(물론 해당 푸시 알림들은 서버에서 보낸것이다)

 

쨋든...

알아보자

 

델리게이트 패턴

- 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번째 인자의 타입이 다르다는 것이다. 확인하고 사용하길 바란다.

+ Recent posts