Responding to the Launch of Your App

panther222128·2021년 3월 23일
0

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app

"Initialize your app's data structures, prepare your app to run, and respond to any launch-time requests from the system."

앱의 데이터 구조를 초기화하고, 앱의 실행을 준비합니다. 그리고 시스템으로부터 모든 launch 타임 요청에 반응합니다.

Overview

사용자가 앱 아이콘을 터치, 즉 앱 실행 시 시스템은 앱을 launch합니다. 또한, 앱이 어떤 이벤트를 요청받았을 때, 시스템은 이 이벤트를 다루기 위해 백그라운드로 launch합니다. scene-based 앱에서, 시스템은 다른 씬이 화면에 나타나야 하거나 어떤 작업을 수행해야 할 때 launch합니다.

모든 앱은 UIApplication 객체가 나타내는 과정에 속하게 됩니다. 앱은 앱 딜리게이트를 가지며, 이는 프로세스 내에 중요한 이벤트 발생 시 이에 반응할 수 있도록 함을 의미합니다. scene-based 앱 또한 launch, 종료 같은 중요한 이벤트를 다루기 위해 앱 딜리게이트를 사용합니다. launch가 일어날 때 UIKit은 자동으로 UIApplication 객체를 생성하고 앱이 딜리게이트 됩니다. 그러면서 메인 이벤트 루프가 시작됩니다.

Provide a Launch Storyboard

사용자가 기기에서 처음 앱을 launch할 때 시스템은 launch 스토리보드를 UI가 준비될 때까지 보여줍니다. launch 스토리보드는 사용자에게 앱이 launch되었고 무엇인가를 하고 있다는 것으로 보여줍니다.

Xcode 프로젝트는 자동적으로 기본값 launch 스토리보드를 갖고 있습니다. 여기에 어떤 것을 추가하는 것은 개발자의 몫입니다. 추가하려면 다음을 따라야 합니다.

  1. 프로젝트를 open합니다.
  2. Choose File > New > File 경로를 따라 선택합니다.
  3. Launch Screen resource를 프로젝트에 추가합니다.

그 후 뷰를 추가하고 오토 레이아웃을 설정하는 등 보여주고자 하는 바를 설정해야 합니다. 잘 활용하기 위해서 참고할 수 있는 자료는 HIG(Human Interface Guidelines)입니다.

Human Interface Guideline
https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen

Initialize Your App's Data Structures

아래 메소드 중 하나 혹은 두 가지 모두를 사용해 launch-time 초기화가 가능합니다.

  • application(_:willFinishLaunchingWithOptions:)
  • application(_:didFinishLaunchingWithOptions:)

UIKit은 이 메소드들을 앱의 launch 주기가 시작할 때 호출합니다. 아래 내용을 수행하기 위해서 이 메소드들을 사용하면 됩니다.

  • 앱의 데이터 구조를 초기화하기 위해 사용합니다.
  • 작동에 필요한 리소스를 앱이 가지고 있는지 검증하기 위해 사용합니다.
  • 앱이 처음 launch될 때 one-time setup을 수행하기 위해 사용합니다. 예를 들어 쓰기가 가능한 디렉토리에 템플릿을 설치하거나 사용자가 수정할 수 있는 파일이 해당합니다. Performing One-Time Setup for Your App을 살펴보시기 바랍니다
  • 앱이 사용하는 중요한 서비스를 연결하기 위해 사용합니다. 예를 들어 앱이 원격 알림을 지원한다면 애플 푸시 알림 서비스에 연결하는 경우가 있습니다.
  • 왜 앱이 launch되어야 하는지에 대한 정보는 launch 옵션 딕셔너리를 확인함으로써 이뤄집니다.

Performing One-Time Setup for Your App
https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app/performing_one-time_setup_for_your_app
https://velog.io/@panther222128/Performing-One-Time-Setup-for-Your-App

앱이 scene-based가 아니라면, UIKit은 launch가 발생할 때 앱이 갖고 있는 기본값 UI를 자동으로 불러옵니다. 인터페이스가 화면에 나타날 때 추가적인 변화를 주고 싶다면 application(_:didFinishLaunchingWithOptions:) 메소드를 사용하면 됩니다. 예를 들어 사용자가 이전에 앱을 사용했을 때 무엇을 했는지를 반영하기 위해 다른 뷰 컨트롤러를 설치하게 될 수도 있습니다.

Move Long-Running Tasks off the Main Thread

사용자가 앱을 launch할 때 좋은 인상을 주기 위해서 빠르게 launch할 수 있도록 하는 것이 좋습니다. UIKitapplication(:didFinishLaunchingwithOptions:) 메소드가 반환된 이후까지 앱의 인터페이스를 전달하지 않습니다. 이 메소드 혹은 application(:willFinishLaunchingWithOptions:) 안에 작업시간이 오래 걸리는 작업을 두면 앱이 나타나기까지 오랜 시간이 걸려 사용자가 지루함을 느낄 수 있습니다. 백그라운드에서 launch하게 되는 경우도 빠르게 할 수 있도록 해야 합니다. 왜냐하면 시스템은 앱의 백그라운드 실행 시간을 제한하기 때문입니다.

앱의 초기화에 중요하지 않은 작업은 옮기는 것이 좋습니다. 예를 들면 아래와 같은 내용이 해당합니다.

  • 즉각적으로 필요하지 않은 것들은 초기화를 지연시키면 좋습니다.
  • 중요하면서도 작업수행이 오래걸리는 것들은 앱의 메인 스레드에서 분리하는 것이 좋습니다. 예를 들어 비동기로 작동하도록 하는 것이 좋습니다.

Determine Why Your App Launched

UIKit이 앱을 launch할 때, UIKit은 앱의 application(:willFinishLaunchingWithOptions:), application(:didFinishLaunchingWithOptions:) 메소드에 왜 앱이 launch되어야 하는지에 대한 정보를 갖는 launch 옵션 딕셔너리를 전달합니다. 이 딕셔너리에 키들은 즉각적으로 수행되어야 하는 중요한 작업을 나타내고 있습니다. 예를 들어 사용자가 어디서든 시작할 수 있는 액션과 앱을 지속하기 위한 액션을 반영하고 있을 것입니다. 항상 예상 가능하고 적절하게 반응할 수 있는 launch 옵션 딕셔너리 내용들을 확인하는 것이 좋습니다.

Note
scene-based 앱인 경우 왜 씬이 생성되어야 하는지를 결정하기 위해서 UIKitapplication(_:configurationForConnecting:options:) 메소드에 전달하고 있는 옵션들을 검토하는 것이 좋습니다.

아래 Listing 1은 백그라운드 위치 업데이트를 다루는 앱을 위한 앱 딜리게이트 메소드 보여주고 있습니다. 위치 키가 나타날 때, 앱은 위치 업데이트를 지연시키지 않고 즉시 위치 업데이트를 시작합니다. 위치 업데이트는 Core Location 프레임워크가 새로운 위치 이벤트를 전달할 수 있도록 만들어줍니다.

Listing 1 Responding to a location event at launch time

class AppDelegate: UIResponder, UIApplicationDelegate, 
               CLLocationManagerDelegate {
    
   let locationManager = CLLocationManager()
   func application(_ application: UIApplication,
              didFinishLaunchingWithOptions launchOptions:
              [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       
      // If launched because of new location data,
      //  start the visits service right away.
      if let keys = launchOptions?.keys {
         if keys.contains(.location) {
            locationManager.delegate = self
            locationManager.startMonitoringVisits()
         }
      }
       
      return true
   }
   // other methods…
}

앱이 이러한 모습에 상응하는 것을 지원하지 않는다면 시스템은 키를 포함하고 있지 않을 것입니다. 예를 들어 원격 알림을 지원하지 않는 앱의 경우에 시스템은 remoteNotification 키를 가지고 있지 않을 것입니다.

어떤 launch 옵션 키가 있는지, 그리고 어떻게 다룰 수 있는지에 대한 정보는 아래 링크에서 참고하면 좋습니다.

UIApplication.LaunchOptionsKey
https://developer.apple.com/documentation/uikit/uiapplication/launchoptionskey
https://velog.io/@panther222128/UIApplication.LaunchOptionsKey

Topics


Launch Time

About the App Launch Sequence

launch 타임에 커스텀 코드가 실행되는 순서에 대해 알아봅니다.

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app/about_the_app_launch_sequence
https://velog.io/@panther222128/About-the-App-Launch-Sequence

Performing One-Time Setup for Your App

앱 환경의 적합한 설정을 가능하게 합니다.

https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app/performing_one-time_setup_for_your_app
https://velog.io/@panther222128/Performing-One-Time-Setup-for-Your-App

Preserving Your App's UI Across Launches

시스템 종료 후 앱을 이전 상태로 되돌립니다.

https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches
https://velog.io/@panther222128/Preserving-Your-Apps-UI-Across-Launches


See Also

Life Cycle

Managing Your App's Life Cycle

앱이 포어그라운드 혹은 백그라운드에 진입할 때 시스템 노티피케이션에 응답합니다. 그리고 다른 중요한 시스템 관련 이벤트를 처리합니다.

https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
https://velog.io/@panther222128/App-Life-Cycle

UIApplication

iOS에서 작동하는 앱에 대한 컨트롤과 조정의 중심점입니다.

https://developer.apple.com/documentation/uikit/uiapplication
https://velog.io/@panther222128/UIApplication-and-App-Delegate

Scenes

앱의 여러 UI 인스턴스들을 동시에 관리하고, 리소스들을 UI의 적합한 인스턴스로 보냅니다.

https://developer.apple.com/documentation/uikit/app_and_environment/scenes
https://velog.io/@panther222128/Scenes


0개의 댓글