BOID
[iOS] 받은 로컬알림 처리하기(UNUserNotificationCenterDelegate) - HoonIOS 본문
안녕하세요. HoonIOS입니다. :)
저번에는 백그라운드 상태로 갔을 때 5초 후 로컬 알림이 발생하도록 하는 예시를 포스팅해봤는데요, 이번에는 로컬 알림을 선택했을 때에 대해 처리하는 것에 대해 알아보려고 합니다.
알림 메시지에 맞는 액션을 처리해줘야하는 경우가 있습니다.
대표적으로 쿠팡을 예로 들어보겠습니다. :)
만약 쿠팡에서 서로다른 제품에 대한 알람이 3개가 왔다고 하면은 그럼 사용자가 그냥 알림을 탭 해서 실행할지 아니면 어느 광고의 알림 메시지를 클릭해서 들어간 건지 구분해야 할 때 어떻게 해야 될까요?
.
.
.
.
정답은 바로 UserNotification프레임워크에 있는 델리게이트 패턴이라고 불리는 프로그래밍 구조를 사용하여 요구사항을 처리를 할 수 있습니다.
※ 델리게이트 패턴이란?
- 위임 패턴인데 한 객체가 할 일을 다른 객체에게 역할을 위임해 다른 객체가 대신 처리하게 해 주는 것입니다.
- 이걸 왜 하지?라고 생각하실 수 있지만 한 객체가 모든 걸 다 처리하면 코딩 양도 엄청나고 한 객체에 역할이 집중되어있는 것을 방지하기 위해서 델리게이트 패턴을 사용합니다.
( 좀 더 자세한 건 다음 포스팅에서 포스팅할게요 😉 )
사용자가 알림을 클릭했을 때 구현하기
- AppDelegate클래스에 UNUserNotificationCenterDelegate 프로토콜을 추가합니다.
※ UNUserNotificationCenterDelegate란?
- 수신 알림 및 알림 관력 작업을 처리하기 위한 인터페이스입니다.
알림을 클릭을 했을때 이벤트를 전달받을 수 있게 하기 위해 delegate는 나야 라고 설정을 해줍니다.
* 코드 설명
- notiCenter.delegate = self로 알림 센터에 뭔가 이벤트가 발생하면 앱 델리게이트인 나한테 말해라고 설정을 해준 것입니다.
※ UserNotificationCenter 델리게이트에 정의된 함수를 설명해주겠습니다. (중요!)
- 상황에 따라 아래 메서드들을 구현해주면 됩니다.
- userNotificationCenter(_:willPresent:withCompletionHandler)
- 앱이 실행되는 도중에 알림이 도착하는 경우에 발생하므로 앱이 실행하는 도중에 알림이 도착했는지 확인을 할수 있습니다.
- 만약 앱 실행중에도 알림배너를 표시해주고 싶으면, 이 메서드를 구현하면됩니다. - userNotificationCenter(_:didReceive:withCompletionHandler:)
- 앱이 실행, 미실행 둘다 상관없이 로컬알림을 클릭했을때 동일하게 호출됩니다.
앱이 실행되는 도중에 알림이 도착한 경우 호출하는 userNotificationCenter(_:willPresent:withCompletionHandler:) 메서드를 구현해 보겠습니다.
* 코드 설명
- 앱이 실행 중인 상태에서도 알림 메시지가 도착하면 알림 배너에 표시되는 것과 상관없이 이 메서드가 호출이 됩니다.
이제 어느 알람인지 식별하는 부분에 대해 살펴보겠습니다.
* 코드 설명
- 알람의 정보를 알아오는 매개변수는 notification을 통해 알 아는 것입니다.
- 앞 포스팅에서 UNMutableNotificationContent객체의 userinfo에 식별 아이디를 HoonIOS로 입력을 했기 때문에 여기서는 사용자가 클릭했을 때 알림 메시지를 식별할 수 있게 해 주는 것입니다.
로컬 알림으로 등록했을 때 입력한 식별 아이디인 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 메시지창도 또 뜨는 것을 볼 수 있습니다.
로컬 알림 받은 것까지 완료했습니다. 델리게이트 패턴을 썻는데요, 아마도 포스팅하고 처음 말씀드린 것 같네요 ㅎㅎㅎ
다음 포스팅은 그래서 중요한 테이블 뷰 컨트롤러에서도 중요한 델리게이트에 대해 포스팅하겠습니다. 그럼 공부와 정리하고 올게요
긴긁읽어주셔서 감사합니다 :)
'IOS 시작기' 카테고리의 다른 글
[iOS] 텍스트 필드의 Text input traits특성 - HoonIOS (1) | 2021.04.17 |
---|---|
[iOS] 텍스트 필드(textField 객체) 란? - HoonIOS (0) | 2021.04.17 |
[iOS] 로컬알림 구현하기 - HoonIOS (0) | 2021.04.13 |
[iOS] 로컬알림이란? - HoonIOS (0) | 2021.04.12 |
[IOS] UIAlertController 응용하기 (텍스트 필드 추가) - HoonIOS (0) | 2021.04.12 |