ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS 앱 생명주기
    오늘의 Swift 상식 2021. 7. 14. 16:53
    728x90
    반응형

     

     

     

     

     

     

     


     

     

     

     

     

    안녕하세요. iOS 개발자 에이든입니다!👦🏻

     

     

     

    첫 번째 게시물로는 어떤 걸 올리면 좋을지 여러 가지 고민을 하다가

    앱 개발 관련 블로그니 뭐니뭐니해도 앱 생명주기가 가장 먼저 나와야 하지 않을까 생각했습니당ㅎㅎ

     

    그럼 시작하죠!

     

     

     

     

    앱 생명주기란?

    앱의 실행부터 종료까지의 주기를 말하며, 앱이 foreground 혹은 background에 있을 때 시스템 알림에 응답하고 기타 중요한 시스템 관련 이벤트를 처리하는 단계들을 말합니다.

     

     

    앱의 Main Run Loop는 사용자가 발생시키는 이벤트에 따라 처리되고, 순서는 아래와 같아요!!

     

    1. 이벤트 발생

    2. UIKit에 의해 설정된 Port를 통해 내부의 Event queue 이벤트 담기

    3. 담겨있는 이벤트를 Main Run Loop에서 하나하나씩 실행

     

    • 아래 그림은 앱의 Main Run Loop의 구조와 사용자 이벤트에 의해 수행되는 단계를 보여주는 그림입니다. (예시는 touch event이고 다른 이벤트들 또한 비슷한 동작 원리로 동작됩니다.)

    이름에서 볼 수 있듯이 Main Run Loop 앱의 Main Thread를 실행하고, 앱을 돌면서 발생된 모든 이벤트를 순차적으로 처리합니다.

     

     

    그럼 이제 iOS 앱의 Life Cycle을 자세히 살펴볼까요?

     

    먼저 그림을 보고 시작하죠!

    (해당 예시에서 점선은 시스템이 하는 것, 실선은 사용자가 하는 것)

     

    • Not Running: 아무것도 실행하지 않은 상태 또는 실행 중이긴 하지만 시스템에 의해서 종료된 상태
    • InActive: 앱이 Foreground 상태로 돌아가지만, 이벤트는 받지 않는 상태, 앱의 상태 전환 과정에서 잠깐 머무는 단계
    • Active: 일반적으로 앱이 돌아가는 상태 (이벤트를 받는 단계)
    • Background: 앱이 Suspended(유예 상태) 상태로 진입하기 전 거치는 상태
    - background일 때 작업을 하는 경우도 많습니다. 예를 들어 데이터 자장이나 그런 류의 작업들?
    - 음악, gps, 녹음 등 앱에서 허락된 기능은 background에서도 동작합니다!
    - 보통의 앱은 스쳐 지나가서 바로 Suspended가 된다고 보시면 됩니다.
    • Suspended: 앱이 Background 상태에 있지만, 아무 코드도 실행하지 않는 상태, 시스템이 임의로 Background 상태의 앱을 Suspended 상태로 만든다.(리소스 해제)

     

    🌟깨알 상식🌟

    1. Launch screen은 코드를 가질 수 없어요.

    2. 흔히 아이폰에서 다른 앱을 사용하기 위해 스와이프나 홈버튼을 눌러서 활성된 앱 리스트를 보죠. 이렇게 앱이 전환 상태에 들어가기 위한 이벤트를 시작하는 순간 inactive 상태가 됩니다.

    3. Suspended가 되면 Not Running과 같다고 봐도 무방합니다!

    4. 애플에서는 background에서 다시 inactive로 가는 경우를 권장합니다. 즉 앱의 데이터가 저장되어있으면 그 화면을 그대로 보여주게 합니다. (단, 은행 앱은 보안을 위해 바로 종료돼서 처음부터 로그인하게 동작하기도 해요!)

     

     iOS 13 이전 버전에서는 AppDelegate가 UI 관련된 모든 Life Cycle 및 window를 관리했지만, iOS 13부터SceneDelegate가 새로 등장하였습니다. SceneDelegate 덕분에 아이패드에서 같은 앱을 여러 개 실행시킬 수 있게 되었고, 각기 다른 window를 볼 수 있게 되었죠!👍🏻

     

     SceneDelegate는 AppDelegate와 유사하지만 가장 큰 차이점SceneDelegate는 각각의 Scene에 대한 Life Cycle을 관리하고, AppDelegate는 App 전체에 대한 Life Cycle을 관리한다고 보시면 될 것 같아요!

     Scene은 서유기의 손오공과 유사합니다. 손오공 자체가 앱이면, 손오공의 분신은 Scene으로 볼 수 있어요. 각각의 손오공 분신들은 손오공과 같은 역할들을 수행할 수 있죠. 또한 분신이 사라져도 본체는 남아있을 수 있지만 본체가 죽으면 모든 분신이 사라지는 것도 공통점으로 볼 수 있겠네요.

     

     

    적절한 비유였나요?ㅎㅎ

     

     

     Scene과 관련하여 추가적인 설명을 해드리자면 사용자는 각 앱에 대해 여러 Scene을 만들 수 있습니다. 사용자나 시스템이 앱에게 새로운 Scene을 요청하면 UIKit이 해당 Scene을 생성하게 됩니다. 또한 Scene을 별도로 보여주고 숨길 수도 있어요.  Scene마다 각자의 Life Cycle이 있기 때문에 각각 다른 상태에 있을 수도 있죠.

     

     

     만약 같은 앱이 두 개 켜져 있다면 이벤트 처리를 어떻게 할까요?

    그런 경우에는 사용자가 요청하는 Scene은 빠르게 foreground로 이동하고, 시스템이 요청한 Scene은 이벤트를 처리할 수 있도록 background로 이동합니다. 그래서 멀티태스킹이 되는 것처럼 보이는 거죠ㅋㅋ

     

     

    마지막으로 App의 전체적인 Life Cycle과 관련된 깨알 지식들 올리며 마치겠습니다!!

    혹시라도 부족하거나 잘못된 부분 그리고 질문 있으시면 언제든 댓글 부탁드려요! 감사합니다!👦🏻👋🏻

     

    - UIApplication 객체는 앱이 실행될 때, 이벤트가 처리될 때, View기반의 인터페이스에서 업데이트가 발생할 때 setup 됩니다.

    - UIApplication은 앱이 생성될 때 생성되고 죽을 때까지 절대 죽지 않아요. 즉 무한 Loop이기 때문에 UIApplication 코드 내에 무한 Loop를 만들면 안 된다.

    - Delegate 객체는 어떤 상황이 되기 직전 혹은 직후에 호출됩니다.

    - 앱의 현재 상태를 알고 싶을 땐 AppDelegate를 통해 알 수 있습니다. UIApplication은 우리가 못 건들입니다ㅠ

    - 앱은 window를 최소 한 개 이상 가지고 있다.
    728x90
    반응형

    '오늘의 Swift 상식' 카테고리의 다른 글

    Protocol 1편 (Protocol 정의 방법)  (0) 2021.08.16
    Class의 상속  (0) 2021.08.15
    Initializer 2편 (Class의 Initializer)  (0) 2021.08.08
    Initializer 1편 (Struct의 Initializer)  (0) 2021.08.08
    Struct, Class  (2) 2021.07.18

    댓글

Designed by Tistory.