앱의 데이터 구조를 초기화하고 앱이 실행되도록 준비하고 시스템의 모든 launch-time request에 respone한다.
Overview
사용자가 홈 화면에서 앱 아이콘을 탭하면 시스템이 앱을 실행한다. 앱이 특정 이벤트를 요청한 경우 시스템은 해당 이벤트를 처리하기 위해 앱을 백그라운드에서 시작할 수도 있다. scene-based 앱의 경우 시스템은 scene 중 하나가 화면에 나타나거나 일부 작업을 수행해야 할 때 유사하게 앱을 시작한다.
모든 앱에는 UIApplication 오브젝트가 나타내는 관련 프로세스가 있다. 또한 앱에는 해당 프로세스 내에서 발생하는 중요한 이벤트에 응답하는 App delegate object(UIApplicationDelegate 프로토콜을 준수하는 오브젝트)가 있다. scene-based 앱 조차도 app delegate를 사용하여 시작 및 종료와 같은 기본 이벤트를 관리한다. 시작시 UIKit은 자동으로 UIApplication 오브젝트와 app delegate를 생성한다. 그런 다음 앱의 기본 이벤트 루프를 시작한다.
Provide a Launch Storyboard
사용자가 장치에서 앱을 처음 시작하면 앱이 UI를 표시할 준비가 될 때까지 시스템이 launch storyboard를 표시한다. launch storyboard를 표시하면 사용자에게 앱이 시작되었고 무언가를 하고 있음을 보여줄 수 있다. 앱이 자체적으로 초기화되고 UI를 빠르게 준비하는 경우 사용자는 launch storyboard를 잠깐만 볼 수 있다.
Xcode 프로젝트에는 커스텀 할 수 있는 default launch storyboard가 자동으로 포함되며 필요에 따라 더 많은 launch storyboard를 추가 할 수 있다. 프로젝트에 새 launch storyboard를 추가하려면 다음을 수행하시오.
- Open your project in Xcode.
- Choose File > New > File.
- Add a Launch Screen resource to your project.
launch storyboard에 뷰를 추가하고 오토 레이아웃 제약 조건을 사용하여 기본 환경에 맞게 조정되도록 크기와 위치를 지정한다. UIKit은 사용 가능한 공간에 뷰를 맞추기 위해 제약 조건을 사용하여 제공한 내용을 정확하게 표시한다. 디자인 지침은 Human Interface Guidelines을 참조하시오.
중요
launch screen에 정적 이미지를 사용하지 마시오. iOS 14 이상에서 시작 화면은 25MB로 제한된다.
Initialize Your App's Data Structures
다음 메서드 중 하나 또는 둘 모두에 앱의 launch-time 초기화 코드를 넣는다.
- application(_:willFinishLaunchingWithOptions:)
- application(_:didFinishLaunchingWithOptions:)
UIKit은 앱의 launch cycle이 시작될 때 이러한 메서드를 호출한다.
이를 사용하여
- 앱의 데이터 구조를 초기화한다.
- 앱에 실행하는 데 필요한 리소스가 있는지 확인한다.
- 앱이 처음 실행될 때 모든 일회성 설정을 수행한다. 예를 들어, 쓰기 가능한 디렉토리에 템플릿이나 사용자가 수정할 수 있는 파일을 설치한다. Performing One-Time Setup for Your App을 참조하시오.
- 앱에서 사용하는 모든 중요한 서비스에 연결한다. 예를 들어 앱이 원격 알림을 지원하는 경우 Apple Push Notification service에 연결한다.
- 앱이 시작된 이유에 대한 정보는 launch options dictionary를 확인하시오. Determine Why Your App Launched을 참조하시오.
scene-based가 아닌 앱의 경우 UIKit은 시작시 default user interface를 자동으로 로드한다. 화면에 표시되기 전에 해당 인터페이스를 추가로 변경하려면 application(_:didFinishLaunchingWithOptions:) 메서드를 사용하시오. 예를 들어 사용자가 마지막으로 앱을 사용했을 때 무엇을 했는지 반영하기 위해 다른 뷰 컨트롤러를 설치할 수 있다.
Move Long-Running Tasks off the Main Thread
사용자는 앱을 실행할 때 빠르게 실행하면 좋은 인상을 남긴다. UIKit은 application(_:didFinishLaunchingWithOptions:) 메서드가 반환 될 때까지 앱의 인터페이스를 표시하지 않는다. 해당 메서드 또는 application(_:willFinishLaunchingWithOptions:) 메서드에서 긴 시간이 필요한 작업을 수행하면 앱이 사용자에게 느리게 보일 수 있다. 시스템이 앱의 백그라운드 실행 시간을 제한하기 때문에 백그라운드로 시작할 때도 빠르게 돌아오는 것아 중요하다.
앱 초기화에 중요하지 않은 작업은 launch-time sequence에서 다른 곳으로 이동한다.
예를 들면
- 앱에 즉시 필요하지 않은 기능의 초기화를 연기한다.
- 중요하고 오래 실행되는 작업을 앱의 메인 스레드에서 이동한다. 예를 들어, global dispatch queue에서 비동기적으로 실행하시오.
Determine Why Your App Launched
UIKit이 앱을 시작할 때 앱이 시작된 이유에 대한 정보와 함께 launch options dictionary을 application(_:willFinishLaunchingWithOptions:) 및 application(_:didFinishLaunchingWithOptions:) 메서드에 전달한다. 해당 dictionary의 키는 즉시 수행 할 중요한 태스크를 나타낸다. 예를 들어 사용자가 다른 곳에서 시작했고 앱에서 계속하려는 작업을 반영 할 수 있다. 항상 launch options dictionary의 내용에서 예상되는 키를 확인하고 해당 키의 존재에 적절하게 응답하시오.
메모
scene-based app의 경우 UIKit이 application(_:configurationForConnecting:options:) 메서드에 전달하는 옵션을 검사하여 scene을 만든 이유를 확인한다.
하단의 코드는 백그라운드 로케이션 업데이트를 처리하는 앱에 대한 앱 델리게이트 메서드를 보여준다. 로케이션 키가 있으면 앱은 나중까지 지연하지 않고 즉시 로케이션 업데이트를 시작한다. 로케이션 업데이트를 시작하면 Core Location 프레임워크가 새 로케이션 이벤트를 전달할 수 있다.
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 option keys 목록과 이를 처리하는 방법에 대한 정보는 UIApplication.LaunchOptionsKey를 참조하시오.
[원문]
Apple Developer Documentation
developer.apple.com
'프로그래밍 > iOS' 카테고리의 다른 글
Responding to Memory Warnings (0) | 2020.12.31 |
---|---|
Performing One-Time Setup for Your App (0) | 2020.12.31 |
Background Tasks (0) | 2020.12.31 |
Preparing Your UI to Run in the Background (0) | 2020.12.31 |
Preparing Your UI to Run in the Foreground (0) | 2020.12.31 |