ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에는 라이프사이클 관련 외에도 메모리 경고를 받을 때나, 하루가 지났다거나, 상태바의 변경 등의 노티도 선언되어 있습니다. 

    필요한 상황에 유용하게 쓰일 수 있을 것 같아요! 

     

     

     

     

     

     

     

    댓글

Designed by Tistory.