-
Notification) 앱 라이프 사이클 notification 받기iOS 2021. 11. 8. 22:07
안녕하세요:)
오늘을 앱 라이프 사이클 노티피케이션에 대해서 알아보겠습니다.
NotificationCenter.default.addObserver(self, selector: #selector(함수), name: UIApplication.didBecomeActiveNotification, object: nil)
위 코드를 보면 name의 파라미터로 UIApplication의 타입 프로퍼티가 노티로 들어가 있고,
어디에서도 해당 noti를 post 해 주는 곳을 찾지 못했는데,,
저 타입 프로퍼티의 설명을 보니 app 이 active 될 때 post 된다고 써있습니다.
app lifecycle에서 자동으로 post 해 준다는 말인 것 같네요 🤔
이런 noti가 또 뭐가 있는지 봅시다!
노티가 꽤 많은데요
- didEnterBackgroundNotification
- willEnterForegroundNotification
- didFinishLaunchingNotification
- didBecomeActiveNotification
- willResignActiveNotfication
- willTerminateNotification
위의 6가지 노티가 라이프 사이클 관련입니다. 오른쪽의 라이프 사이클 그림과 같이 보면 좋을 것 같아요 :)
참고로 UIApplication 클래스의 타입 프로퍼티이기 때문에 씬(scene)이 아닌 앱의 관점에서의 라이프 사이클이에요!
그럼 테스트를 해봅시다~
// viewController.swift override func viewDidLoad() { super.viewDidLoad() self.setObserver() } private func setObserver() { NotificationCenter.default.addObserver(self, selector: #selector(self.becomActive), name: UIApplication.didBecomeActiveNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.enterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.enterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.resignActive), name: UIApplication.willResignActiveNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.terminate), name: UIApplication.willTerminateNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(self.finishLaunching), name: UIApplication.didFinishLaunchingNotification, object: nil) }
이렇게 각 노티를 받기 위해서 observer를 뷰 컨트롤러에 등록해 주겠습니다.
노티를 받으면 실행 시켜줄 함수에는 어떤 노티를 받았는지 print 하도록 할게요!
@objc func becomActive() { print("여기는 didBecomeActive") } @objc func enterBackground() { print("여기는 didEnterBackground") } @objc func enterForeground() { print("여기는 willEnterForeground") } @objc func resignActive() { print("여기는 willResignActive") } @objc func terminate() { print("여기는 didEnterBackground") } @objc func finishLaunching() { print("여기는 didFinishLaunching") }
그럼 앱을 실행 시켜보겠습니다 !
자 먼저 앱을 실행 시키고 나면 다음과 같이 로그가 찍히네요
foreground -> active 의 순서를 거쳐서 노티를 post 하는 걸 볼 수 있습니다.
자 그리고 나서 백그라운드로 나가기 위해서 앱을 다음과 같은 상태로 만들었습니다. 그러니까 willResignActive 노티가 뜨네요!
active 상태에서 벗어날 것이라는 것을 알 수 있습니다. 이 상태에서 다시 앱으로 진입하면 다시 didBecomeActive 가 뜹니다.
다시 위 사진의 상태에서
앱을 종료하지 않은! 상태로 홈 화면으로 진입하면
didEnterBackground. 앱은 백그라운드에 진입한 상태가 됩니다.
남은 노티는
didFinishLaunching
willTerminate
인데요.
사실 이 두 노티는 뷰 컨트롤러에서 실행한 print 함수에서 볼 수가 없습니다.
AppDelegate의 라이프 사이클 함수와 ViewController의 viewDidLoad()/ viewDidDisappear() 에 print를 찍어보면요
// AppDelegate.swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. print("didFinishLaunchingWithOptions") return true } func applicationWillTerminate(_ application: UIApplication) { print("applicationWillTerminate") } // ViewController.swift override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. print("viewDidLoad") self.setObserver() } override func viewDidDisappear(_ animated: Bool) { print("viewDidDisappear") }
이렇게 앱이 실행될 때는 observer를 추가해준 viewDidLoad 함수보다 먼저 didFinishLaunch 가 수행되고,
앱이 종료될 때에는 viewController가 앱의 terminate 함수 호출보다 먼저 사라진다는 것을 알 수 있습니다 !!
UIApplication의 notification에는 라이프사이클 관련 외에도 메모리 경고를 받을 때나, 하루가 지났다거나, 상태바의 변경 등의 노티도 선언되어 있습니다.
필요한 상황에 유용하게 쓰일 수 있을 것 같아요!
'iOS' 카테고리의 다른 글
실전! CleanSwift 바로 써먹기 -1 (세팅 및 scene, payload 모델 생성) (2) 2021.10.11 Core Data) CoreData에서 enum 값으로 검색하기 (1) 2021.08.16 Core Data) NSPredicate (0) 2021.08.16