BOID

[iOS] 받은 로컬알림 처리하기(UNUserNotificationCenterDelegate) - HoonIOS 본문

IOS 시작기

[iOS] 받은 로컬알림 처리하기(UNUserNotificationCenterDelegate) - HoonIOS

HoonIOS 2021. 4. 13. 16:47
728x90

안녕하세요. HoonIOS입니다. :)

 

저번에는 백그라운드 상태로 갔을 때 5초 후 로컬 알림이 발생하도록 하는 예시를 포스팅해봤는데요, 이번에는 로컬 알림을 선택했을 때에 대해 처리하는 것에 대해 알아보려고 합니다.

boidevelop.tistory.com/59

 

[iOS] 로컬알림 구현하기 - HoonIOS

안녕하세요 HoonIOS입니다. :) 우선 로컬 알림이란? - 앱 내부에서 만든 특정 메시지를 iOS 알림 센터를 통해 메시지를 전송하는 방식입니다. boidevelop.tistory.com/58 [iOS] 로컬알림이란? - HoonIOS 안녕하세

boidevelop.tistory.com

알림 메시지에 맞는 액션을 처리해줘야하는 경우가 있습니다.

 

대표적으로 쿠팡을 예로 들어보겠습니다. :)

 

만약 쿠팡에서 서로다른 제품에 대한 알람이 3개가 왔다고 하면은 그럼 사용자가 그냥 알림을 탭 해서 실행할지 아니면 어느 광고의 알림 메시지를 클릭해서 들어간 건지 구분해야 할 때 어떻게 해야 될까요?

.

.

.

.

정답은 바로 UserNotification프레임워크에 있는 델리게이트 패턴이라고 불리는 프로그래밍 구조를 사용하여 요구사항을 처리를 할 수 있습니다.

※ 델리게이트 패턴이란?

- 위임 패턴인데 한 객체가 할 일을 다른 객체에게 역할을 위임해 다른 객체가 대신 처리하게 해 주는 것입니다.

- 이걸 왜 하지?라고 생각하실 수 있지만 한 객체가 모든 걸 다 처리하면 코딩 양도 엄청나고 한 객체에 역할이 집중되어있는 것을 방지하기 위해서 델리게이트 패턴을 사용합니다.

 

( 좀 더 자세한 건 다음 포스팅에서 포스팅할게요 😉 )

 

 

 

 사용자가 알림을 클릭했을 때 구현하기

 

 

- AppDelegate클래스에 UNUserNotificationCenterDelegate 프로토콜을 추가합니다.

 

※ UNUserNotificationCenterDelegate란?

- 수신 알림 및 알림 관력 작업을 처리하기 위한 인터페이스입니다.

알림을 클릭을 했을때 이벤트를 전달받을 수 있게 하기 위해 delegate는 나야 라고 설정을 해줍니다.

 

* 코드 설명

- notiCenter.delegate = self로 알림 센터에 뭔가 이벤트가 발생하면 앱 델리게이트인 나한테 말해라고 설정을 해준 것입니다.

 

※ UserNotificationCenter 델리게이트에 정의된 함수를 설명해주겠습니다. (중요!)

- 상황에 따라 아래 메서드들을 구현해주면 됩니다.

  1. userNotificationCenter(_:willPresent:withCompletionHandler)
    - 앱이 실행되는 도중에 알림이 도착하는 경우에 발생하므로 앱이 실행하는 도중에 알림이 도착했는지 확인을 할수 있습니다.
    - 만약 앱 실행중에도 알림배너를 표시해주고 싶으면, 이 메서드를 구현하면됩니다.
  2. userNotificationCenter(_:didReceive:withCompletionHandler:)
    - 앱이 실행, 미실행 둘다 상관없이 로컬알림을 클릭했을때 동일하게 호출됩니다.

앱이 실행되는 도중에 알림이 도착한 경우 호출하는 userNotificationCenter(_:willPresent:withCompletionHandler:) 메서드를 구현해 보겠습니다.

 

* 코드 설명

- 앱이 실행 중인 상태에서도 알림 메시지가 도착하면 알림 배너에 표시되는 것과 상관없이 이 메서드가 호출이 됩니다.

 

 

이제 어느 알람인지 식별하는 부분에 대해 살펴보겠습니다.

* 코드 설명

- 알람의 정보를 알아오는 매개변수는 notification을 통해 알 아는 것입니다.

- 앞 포스팅에서 UNMutableNotificationContent객체의 userinfo에 식별 아이디를 HoonIOS로 입력을 했기 때문에 여기서는 사용자가 클릭했을 때 알림 메시지를 식별할 수 있게 해 주는 것입니다.

UNMutableNotification에 설정해준 userInfo

 

로컬 알림으로 등록했을 때 입력한 식별 아이디인 userinfo를 읽어오는 속성에 대해 알아보겠습니다.

 

* 코드 설명

- notification.request.content.userInfo는 notification의 UNNotificationRequest객체에 등록한 UNMutableNotificationContent객체의 userinfo 속성을 가져오는 것입니다.

- 즉 아래 그림과 같이 큰 물에서 작은 물로 파로 들어간다고 생각을 하면 됩니다.

 

 

이제 절대 빼먹으면 안 되는 것은 바로 completionHandler( ) 메서드를 반드시 호출해야 합니다.

 

* 코드 설명

- 만약 이를 생략하면 앱 실행 도중에 알림 배너가 표시되지 않습니다.

( 무조권 무조권 구현을 해주어야 합니다. )

 

이제 다른 델리게이트 패턴 메서드 중 하나인 userNotificationCenter(_:didReceive:withCompletionHandler:)을 구현해보겠습니다.

 

이 메서드는 사용자가 알림 메시지를 클릭했을 때 실행하는 메서드입니다.

만약 어떤 제품에 대한 내용의 알림이면 그 알림을 클릭했을 때 해당 뷰로 이동하려고 할 때 이 메서드를 사용하여 구현하면 됩니다.

 

그럼 한번 구현을 해보겠습니다. 

* 코드 설명

- 알 림메 시지에 대한 정보는 response 매개변수에 담겨 전달이 됩니다.

- 그러므로 해당 알림인지 식별을 하기 위해서는 response를 이용하면 됩니다.

 

알림을 식별할 if문을 구현해보겠습니다.

 

* 코드 설명

- response매개변수에 알 림메 시지에 대한 정보가 모두 담겨있으므로 response에서 UNUserNotificationCenter에 등록한 UNNotificationRequest 객체에 등록한 UNMutableNotificationContent의 userinfo에 접근을 해 해당 key가 있는 값을 출력합니다.

( 어휴 말 어렵다 간단하게 모식도로 보여드릴게요 )

 

- 아래는 위의 설명에 대한 모식도로 안에 안에 안에 쭈우욱~~~ 접근을 한 것입니다.

userinfo에 접근을 했으니 해당 key가 name인 값을 print 하겠습니다.

 

* 코드 설명

- 알림 메시지의 정보인 userinfo에 접근하는 방식으로 위의 모식도로 접근하는 것과 같습니다. 따라서 접근을 해서 해당 key가 있는 값을 출력합니다.

 

 

지금까지는 userinfo의 value값만 출력하는 코드를 수행했지만 실제로 코딩을 할 때는 식별자를 확인해 사용자가 어떤 알림 메시지를 클릭했는지 판단할수 있고 그에 맞게 처리를 해줄수 있습니다.

 

- 해당 영상을 보면 알림 메시지를 선택하여 didReceive 델리게이트 메서드가 호출되고 앱이 켜진 상태에서 알림 메시지가 오면 willPresent 델리게이트 메서드가 호출되는것을 확인할수 있습니다.
- willPresent 델리게이트 메서드가 호출된 알림메시지를 클릭하면은 didReceive 메시지창도 또 뜨는 것을 볼 수 있습니다.

 

로컬 알림 받은 것까지 완료했습니다. 델리게이트 패턴을 썻는데요, 아마도 포스팅하고 처음 말씀드린 것 같네요 ㅎㅎㅎ

 

다음 포스팅은 그래서 중요한 테이블 뷰 컨트롤러에서도 중요한 델리게이트에 대해 포스팅하겠습니다. 그럼 공부와 정리하고 올게요 

 

긴긁읽어주셔서 감사합니다 :)

반응형
Comments