"Initialize your app's data structures, prepare your app to run, and respond to any launch-time requests from the system."
앱의 데이터 구조를 초기화하고, 앱의 실행을 준비합니다. 그리고 시스템으로부터 모든 launch 타임 요청에 반응합니다.
사용자가 앱 아이콘을 터치, 즉 앱 실행 시 시스템은 앱을 launch합니다. 또한, 앱이 어떤 이벤트를 요청받았을 때, 시스템은 이 이벤트를 다루기 위해 백그라운드로 launch합니다. scene-based 앱에서, 시스템은 다른 씬이 화면에 나타나야 하거나 어떤 작업을 수행해야 할 때 launch합니다.
모든 앱은 UIApplication
객체가 나타내는 과정에 속하게 됩니다. 앱은 앱 딜리게이트를 가지며, 이는 프로세스 내에 중요한 이벤트 발생 시 이에 반응할 수 있도록 함을 의미합니다. scene-based 앱 또한 launch, 종료 같은 중요한 이벤트를 다루기 위해 앱 딜리게이트를 사용합니다. launch가 일어날 때 UIKit
은 자동으로 UIApplication
객체를 생성하고 앱이 딜리게이트 됩니다. 그러면서 메인 이벤트 루프가 시작됩니다.
사용자가 기기에서 처음 앱을 launch할 때 시스템은 launch 스토리보드를 UI가 준비될 때까지 보여줍니다. launch 스토리보드는 사용자에게 앱이 launch되었고 무엇인가를 하고 있다는 것으로 보여줍니다.
Xcode 프로젝트는 자동적으로 기본값 launch 스토리보드를 갖고 있습니다. 여기에 어떤 것을 추가하는 것은 개발자의 몫입니다. 추가하려면 다음을 따라야 합니다.
그 후 뷰를 추가하고 오토 레이아웃을 설정하는 등 보여주고자 하는 바를 설정해야 합니다. 잘 활용하기 위해서 참고할 수 있는 자료는 HIG(Human Interface Guidelines)입니다.
Human Interface Guideline
https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen
아래 메소드 중 하나 혹은 두 가지 모두를 사용해 launch-time 초기화가 가능합니다.
application(_:willFinishLaunchingWithOptions:)
application(_:didFinishLaunchingWithOptions:)
UIKit은 이 메소드들을 앱의 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:)
메소드를 사용하면 됩니다. 예를 들어 사용자가 이전에 앱을 사용했을 때 무엇을 했는지를 반영하기 위해 다른 뷰 컨트롤러를 설치하게 될 수도 있습니다.
사용자가 앱을 launch할 때 좋은 인상을 주기 위해서 빠르게 launch할 수 있도록 하는 것이 좋습니다. UIKit
은 application(:didFinishLaunchingwithOptions:)
메소드가 반환된 이후까지 앱의 인터페이스를 전달하지 않습니다. 이 메소드 혹은 application(
:willFinishLaunchingWithOptions:)
안에 작업시간이 오래 걸리는 작업을 두면 앱이 나타나기까지 오랜 시간이 걸려 사용자가 지루함을 느낄 수 있습니다. 백그라운드에서 launch하게 되는 경우도 빠르게 할 수 있도록 해야 합니다. 왜냐하면 시스템은 앱의 백그라운드 실행 시간을 제한하기 때문입니다.
앱의 초기화에 중요하지 않은 작업은 옮기는 것이 좋습니다. 예를 들면 아래와 같은 내용이 해당합니다.
UIKit
이 앱을 launch할 때, UIKit
은 앱의 application(:willFinishLaunchingWithOptions:)
, application(
:didFinishLaunchingWithOptions:)
메소드에 왜 앱이 launch되어야 하는지에 대한 정보를 갖는 launch 옵션 딕셔너리를 전달합니다. 이 딕셔너리에 키들은 즉각적으로 수행되어야 하는 중요한 작업을 나타내고 있습니다. 예를 들어 사용자가 어디서든 시작할 수 있는 액션과 앱을 지속하기 위한 액션을 반영하고 있을 것입니다. 항상 예상 가능하고 적절하게 반응할 수 있는 launch 옵션 딕셔너리 내용들을 확인하는 것이 좋습니다.
Note
scene-based 앱인 경우 왜 씬이 생성되어야 하는지를 결정하기 위해서UIKit
이application(_: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
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
앱 환경의 적합한 설정을 가능하게 합니다.
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
시스템 종료 후 앱을 이전 상태로 되돌립니다.
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
앱이 포어그라운드 혹은 백그라운드에 진입할 때 시스템 노티피케이션에 응답합니다. 그리고 다른 중요한 시스템 관련 이벤트를 처리합니다.
https://developer.apple.com/documentation/uikit/app_and_environment/managing_your_app_s_life_cycle
https://velog.io/@panther222128/App-Life-Cycle
iOS에서 작동하는 앱에 대한 컨트롤과 조정의 중심점입니다.
https://developer.apple.com/documentation/uikit/uiapplication
https://velog.io/@panther222128/UIApplication-and-App-Delegate
앱의 여러 UI 인스턴스들을 동시에 관리하고, 리소스들을 UI의 적합한 인스턴스로 보냅니다.
https://developer.apple.com/documentation/uikit/app_and_environment/scenes
https://velog.io/@panther222128/Scenes