JosephCha의 개발일지

iOS 동작과정 본문

iOS

iOS 동작과정

JosephCha 2023. 8. 9. 15:06
반응형

 

  • iOS 앱은 사용자 정의 코드, 시스템 프레임워크 간의 상호작용으로 동작
  • 사용자(개발자) 정의 코드(Custom Code): 원하는 기능과 UI 구현 가능
  • 시스템 프레임워크: 편집 불가
    • iOS 기반의 앱이 실행되는 데 필요한 기초 환경을 제공
앱을 실행하는 것은 복잡한 일련의 단계를 포함하며, 대부분은 시스템이 자동으로 처리함. Launch sequence동안, UIKit은 AppDelegate의 메소드를 호출하여 user interaction을 위해 앱을 준비하고 앱의 요구사항과 관련된 모든 작업을 수행할 수 있음. 

Application Life cycle을 알아보기 전에 앱 구조와 main run loop에 대해서 먼저 알아보자.

앱 구조와 main run loop 참고: Structure of APP

다음은 앱이 실행되는 시점부터 시퀀스가 완료될 때까지 실행 시퀀스의 개별 단계를 보여줌

1. 먼저 사용자가 실행할 앱의 아이콘을 클릭해 실행 시킴

2. 시스템은 Xcode가 제공하는 main() 함수를 실행함. main() 함수는 UIApplicationMain(::::_:)함수를 호출하여, AppDelegate의 인스턴스와 UIApplication의 인스턴스를 생성함

Objective-C는 C 언어 기반 프로그램으로서 시작점이 main 함수이지만, Swift는 C언어 기반이 아니기 때문에 main 함수파일이나, 시작포인트가 존재하지 않음. 따라서, Swift는 @main 어노테이션 표기를 사용해서 이를 대체함 (아래 코드 참고)
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
	//..
}
  • 보다시피 AppDelegate안에 @main이라는 어노테이션이 존재한다. (iOS 12이전에서는 @UIApplication)
  • iOS 앱에서는 UIKit framework가 main 함수를 관리하여 앱 개발자들이 직접 main함수를 작성하지 않음. 그렇다고 개발자들이 아예 앱의 실행에 관여하지 못하는 것은 아님. UIKit은 main함수를 다루는 과정에서 UIApplication객체가 생성되는데, 이 객체를 통해서 앱의 실행에 부분적으로 관여 할 수 있음
  • UIApplicationMain함수는 코코아 터치 프레임워크에서 앱의 라이프 사이클을 시작하는 함수. UIApplication 객체의 인스턴스를 만들고, 해당 객체의 앱으로서 기능하기 위한 기반을 마련 하는데 이 과정을 앱 로딩 프로세스라고 함
  • UIApplicationMain을 호출하면 아래와 같이 4개의 매개변수를 넘겨줘야함

  • argc
    • argv의 개수 (실행 명령어의 개수)
  • argv
    • argument의 변수 목록
  • principalClassName
    • UIApplication 클래스를 서브클래싱 한 경우 해당 클래스 이름을 전달하면됨
    • nil을 전달하면 이 값은 UIApplication으로 고정됨
  • delegateClassName
    • App delegate 클래스 이름을 전달하면됨
    • 만약 nib 파일 내 app delegate 객체가 정의되어있다면 nil을 전달해야함
  • 즉, main 함수안에서 실행되는 UIApplicationMain함수는 앱에 중요한 객체인 UIApplication 을 생성하고, 스토리보드에서 UI를 로딩하고 앱의 초기 셋팅값(info.plist)를 불러오고 앱을 run loop에 올려놓으며 함수를 진행시킴

3. UIKit은 앱의 info.plist 파일 또는 Xcode project 파일의 타겟에서 지정한 기본 Storyboard를 로드함

4. UIKIt은 AppDelegate에서 application(_:willFinishLaunchingWithOptions:)메소드를 호출함

5. UIKit은 state restoration을 수행하여 AppDelegate 및 앱의 ViewController들에서 추가적인 메서드를 실행함

6. UIKit은 AppDelegate에서 application(_:didFinishLaunchingWithOptions:)메소드를 호출함

7. Launch sequence가 완료되면, 시스템은 AppDelegate 또는 SceneDelegate를 사용해, 앱의 user interface를 표시하고 수명 주기를 관리함

4번~7번 상세 설명

  • 이때는 그림에서 오른쪽 상자에 Your Code라고 나와있는 부분을 보면 된다. 이러한 메서드 내부에서 커스텀 코드를 작성하여 앱이 launch process를 시작하고 끝내는 동안 이벤트를 설정할 수 있음
  • application:willFinishLaunchingWithOptions
    • App 최초 실행될 때 호출되는 메서드
    • AppDelegate에게 현재 launch process가 시작되었다고 알려줌
    • 그러나 아직 state restoration은 진행되지 않은 상태
  • app state restoration
    • App 실행 시 UIKit은 앱을 이전 상태로 복원을 시도함
      • 예를 들어, 특정 화면에 있다가 앱을 끄고 다시 켰을 때 특정 화면으로 복원하는 것
    • 이때 UIKit은 App에서 유저 인터페이스를 보존한 뷰 컨트롤러 객체를 생성 또는 locate하도록 App에 요청함
    • 이후 아래와 같은 로직을 수행하고 application:didFinishLaunchingWithOptions를 호출함 app state restoration

  • application:didFinishLaunchingWithOptions
    • AppDelegate에게 현재 launch process가 거의 끝났고 앱이 거의 시작하기 전이라고 알려줌
    • state restoration 직후에 호출되지만, 아직 App의 window나 UI는 표시되기 전임 

Step2

  • 이제 App Launch가 끝나고 실제로 Running에 들어옴. 앱이 실행되고 사용자에게 화면이 보여짐
  • applicationDidBecomeActive:
    • App이 active 상태로 전환된 직후에 호출이 됨
  • Event Loop
    • App이 작동하면서 앱을 만들때 개발자가 작성했던 코드들이 실행됨

⚠️ 윗 그림들은 iOS 13이전에 즉, Scene의 개념이 등장하기 전에 AppDelegate에 의해서 Application Life cycle이 관리되었을 때의 그림임

 

  • 따라서 iOS 13이후에는 이제 step1 단계(initailization)이 끝나면 위의 그림처럼 system이 scene delegate나 app delegate를 사용해서 UI를 표시하고, app의 UI life cycle을 관리하게 됨
  • 이후의 내용, 즉 scene delegate와 app delegate에 의한 이후 UI life cycle 관리는 Managing your app’s life cycle를 보면됨

참고: https://jryoun1.github.io/ios/ApplicationLifeCycle/

 

'iOS' 카테고리의 다른 글

SOLID 원칙  (0) 2023.08.09
네트워크 Endpoint  (0) 2023.08.09
UIKit 기본개념  (0) 2023.08.09
객체지향 프로그래밍  (0) 2023.02.08
Content Hugging priority & Content Compression Resistance priority  (0) 2021.11.29
Comments