[Day 46] NotificationCenter 넌 누구니?
NotificationCenter를 사용하여 위치권한 확인하기!
❓ NotificationCenter 넌 누구니?
오늘은 앱이 포그라운드로 진입했을 때 특정 함수를 실행하도록 처리하는 데에 NotificationCenter
를 알아보죠!! 마치 앱 안의 전광판 방송 시스템 처럼 동작하는데, 어떤 이벤트가 발생했을 때 여러 객체에 동시에 알림을 전달할 수 있어요.
이게 무슨 소리냐면요 이번의 프로젝트 하면서 했던 예를 들어서 설명을 해볼게요.
앱이 포그라운드로 진입할 때마다 위치 권한을 다시 확인하고 싶다면? NotificationCenter
를 이용해서 해당 이벤트에 반응하도록 옵저버를 등록하면 된답니다?
📌 NotificationCenter란?
A라는 객체가 “이런일이 생겼어요!” 하고 알리면, 그 알림을 듣기로한 B,C 객체들이 각각 반응할 수 있는 구조
iOS에서 이벤트 기반으로 객체 간 소통을 가능하게 해주는 시스템이에요
예를 들어서, 앱이 포그라운드로 전환될 때 위치 권한을 다시 확인해야 하는 경우가 있어요. 이럴 땐 NotificationCenter
를 사용해서 시스템 이벤트인 UIApplication.willEnterForegroundNotification
을 감지하고, 위치 권한을 체크하는 함수를 실행할 수 있답니다.
▶️ 그래서 어떻게 쓰는건데?
시스템에 있는 기본 구성 요소들은 다음과 같은 아이들이 있어요 | 구성요소 | 설명 | | —– | —- | | NotificationCenter.default | 시스템에서 제공하는 싱글톤 객체 | | addObserver(: selector:name:object) | 옵저버 등록 | | removeObserver(:) | 옵저버 제거 | | post(name:object:userInfo:) | 알림 전송 | | Notification.Name | 알림 이름 정의 (.keyboardWillShow, .appDidEnterForeground 등) | | object | 특정 발신자 객체만 필터링 가능 (기본은 nil로 전체 대상 수신) | | userInfo | 알림과 함께 전달할 수 있는 딕셔너리 (선택) |
기본적으로 옵저버를 등록하는 방법은
1
2
3
4
5
6
NotificationCenter.default.addObserver(
self,
selector: #selector(handleNotification(_:)),
name: .appDidEnterForeground, // 수신할 알림 이름
object: nil // 어떤 객체에서 보낸 알림을 받을지 (nil이면 전체)
)
- selector: 알림 수신 시 실행할 메서드 (필수: @objc 붙여야 함)
- name: 어떤 알림 이름을 받을지 (Notification.Name 타입)
- object: 특정 객체에서 발생한 알림만 받고 싶다면 설정 (보통은 nil 사용)
자 앱이 포그라운드로 전환될 때 위치권한을 다시 확인해야 하는 경우로 설명을 해볼게요.
- 먼저 옵저버를 등록을 해서 알림 받을 준비를 해야겠죠?
- 알림을 받을 에 아래 처럼 등록을 해줍니다. 일단 저는
MapView
에서 받아야하니MapViewConteroller
에 등록을 해줄게요!1 2 3 4 5 6
NotificationCenter.default.addObserver( self, // 알림을 받을 객체 (보통 self) selector: #selector(checkLocationAuthorization), // 알림 발생 시 실행할 메서드 name: UIApplication.didBecomeActiveNotification, // 어떤 알림을 들을지 object: nil // 특정 객체에서 발생한 알림만 받을지 여부 (nil이면 전체) )
- 알림을 받을 에 아래 처럼 등록을 해줍니다. 일단 저는
- 알림을 주는 곳을 지금은 시스템에있는 Notification을 사용했지만 커스텀 하는 방법으로는 다음과 같아요!
- 알림을 보내는 곳은 앱이 포그라운드로 전환 될때를 알아야하니 SceneDelegate에서 알림을 보내는걸 설정해 줄게요
1 2 3 4
func sceneWillEnterForeground(_: UIScene) { // 앱이 포그라운드로 진입할 때 알림을 보냄 NotificationCenter.default.post(name: .didBecomeActiveNotification, object: nil) }
- 알림을 보내는 곳은 앱이 포그라운드로 전환 될때를 알아야하니 SceneDelegate에서 알림을 보내는걸 설정해 줄게요
- 마지막으로 이제 알림을 받아서 실행할 메서드
checkLocationAuthorization
을 구현해야겠죠?1 2 3
@objc func checkLocationAuthorization() { ... }
이러면 준비 끝!
한번 볼까요?
맺으며: 춘식이와 함께하는 스마트한 개발
오늘은 NotificationCenter로 이벤트를 관찰하는걸 배웠는데 확실히 너무 많은 것들이 있어 외우는건 어렵지만 그래도 이렇게 뭐든 하나하나 써보면서 어떤것 들이 있는지 기억속 어딘가에 심어 놓기만 해도 좋은거라고 생각해요
오늘도 오류 내며 자란 춘식이였습니다. 🐾 더 열심히 노력 해서 좋은 iOS Developer가 되자!
혹시 이 글을 보시는 분들 중 더 유용한 팁이 있다면 댓글로 많이 알려주세요!