본문 바로가기

공부/iOS

iOS - Responding to the Launch of Your App(앱 시작에 대한 응답)

안녕하세요. brody입니다

 

이번 포스팅에서는 UIKit의 App and Environment의 아티클 중 하나입니다

 

그럼 바로 시작할게요

 

애플 원문 링크는 아래와 같습니다!

 

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

 


Responding to the Launch of Your App

앱의 데이터 구조를 초기화 하고, 앱이 실행되도록 준비하며 시스템의 모든 launch-time 요청에 응답합니다.

 

Overview

사용자가 홈 화면에서 앱 아이콘을 탭하면 시스템이 앱을 실행합니다.

 

앱이 특정 이벤트를 요청한 경우 시스템은 해당 이벤트를 처리하기 위해 백그라운드에서 앱을 실행할 수도 있습니다.

 

씬 기반(scene-based) 앱의 경우 씬 중 하나가 화면에 나타나거나 작업을 수행해야 할 때 도 마찬가지로 시스템이앱을 시작합니다.

 

모든 앱에는 UIApplication 객체가 나타내는 연결된 프로세스(associated process)가 있습니다.

 

또한 앱에는 app delegate 객체(UIApplicationDelegate 프로토콜을 준수하는 객체)가 있으며, 이 객체는 해당 프로세스 내에서 발생하는 중요한 이벤트에 응답합니다.

 

씬 기반(scene-based)앱도 App dlelegate 를 사용하여 시작 및 종료와 같은 기본 이벤트를 관리합니다.

 

실행 시 UIKit은 자동으로 UIApplication 객체와 App delegate를 생성합니다.

 

그런 다음 앱의 메인 이벤트 루프를 시작합니다.

 

Provide a Launch Storyboard(런치 스토리보드 제공)

사용자가 디바이스에서 앱을 처음 시작하면 앱이 UI를 표시할 준비가 될 때까지 시스템은 launch storyboard를 보여줍니다.

 

launch storyboard를 표시하면 사용자에게 앱이 실행 중이고, 어떤 작업을 수행중인지 확인시켜줄 수 있습니다.

 

앱이 자체적으로 초기화되고, UI를 빠르게 준비하는 경우 사용자는 launch storyboard를 잠깐동안 볼 수 있습니다.

 

Xcode 프로젝트에는 사용자가 커스터마이징 할 수 있는 기본 launch storyboard가 자동으로 포함되며 필요에 따라 launch storyboard를 추가 할 수 있습니다.

 

프로젝트에 새로운 launch storyboard를 추가하려면 아래와 같이 수행하십시오.

 

1. Xcode 프로젝트를 엽니다.

 

2. File -> New -> File을 선택합니다.

 

3. Launch Screen 리소스를 프로젝트에 추가하세요.

 

launch storyboard에 View를 추가하고 Auto layout constraints를 이용하여 기본 환경에 맞게 크기를 조정하고 배치합니다.

 

UIKit은 사용 가능한 공간에 View를 맞추기 위해 제약 조건을 사용하여 제공하는 내용을 정확하게 표시합니다.

 

디자인 가이드라인은 Human Interface Guidelines를 참고하세요.

 

IMPORTANT

iOS 13 이상에서는 항상 앱에 대한 launch storyboard를 제공합니다. 

static launch image를 사용하지 마세요!

 

 

Initialize Your App's Data Structures(앱의 데이터 구조 초기화)

다음 방법 중 하나 또는 두가지 모두의 방법으로 앱의 launch-time 초기화 코드를 넣을 수 있습니다.

 

 

UIKit은 app's 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 Task off the Main Thread (길게 하는 task를 Main Thread에서 옮기세요)

사용자가 앱을 실행하면 빠르게 실행하여 좋은 인상을 남겨야 합니다.

 

UIKit은 application (_:didFinishLaunchingWithOptions:) 메서드가 반환될 때까지 앱의 인터페이스를 표시하지 않습니다.

 

해당 메서드 또는 application (_:willFinishLaunchingWithOptions:) 메서드에서 long-running task를 수행하면 앱이 사용자에게 느리게 보일 수 있습니다.

 

시스템이 앱의 백그라운드 실행 시간을 제한하기 때문에 백그라운드로 시작할 때 빠르게 돌아오는것도 중요합니다.

 

앱 초기화에 중요하지 않은 작업을 launch-time sequnce 밖으로 이동합니다. 예를 들면 아래와 같습니다.

 

  • 앱에 즉시 필요하지 않은 기능의 초기화를 연기합니다.

  • 중요하고 장기간 실행중인 작업은 앱의 메인 쓰레드에서 다른곳으로 옮깁니다. 
    예를 들어 global dispatch queyue 와 비동기 처리가 있습니다.

 

Determine Why Your App Lauched(앱이 실행된 이유 확인)

UIKit이 앱을 시작할 때 앱이 시작된 이유에 대한 정보와 함께 launch option dictionary를  application (_:didFinishLaunchingWithOptions:) 와 application (_:willFinishLaunchingWithOptions:) 메서드에 전달합니다.

 

해당 dictionary 키는 즉시 수행할 중요한 작업을 나타냅니다.

 

예를 들어 사용자가 다른 곳에서 시작했고 앱에서 계속하려는 작업을 반영 할 수 있습니다.

 

항상 launch options dictionary를 확인하여 에상되는 키를 확인하고 해당 키의 존재에 적절하게 대응해야 합니다.

 

NOTE 

씬 기반(scene-based) 앱의 경우 UIKit이 application(_:configurationForConnecting:options:) 메서드에 전달하는 옵셜을 검사하여 scene을 만든 이유를 확인해야 합니다.

 

아래의 Listing 1은 백그라운드 위치 업데이트를 처리하는 앱의 App delegate 메서드를 보여줍니다.

 

위치 키가 있으면 앱은 위치 업데이트를 나중까지 지연하지 않고 바로 시작합니다.

 

위치 업데이트를 시작하면 Core Location 프레임워크가 새 위치 이벤트를 제공할 수 있습니다.

 

 

(테스트 해봤는데 안되서 여기저기 찾아보니... 앱을 완전히 종료 했다가 푸시가 와서 그거 눌러서 앱을 가동하면 launchOptions에 push관련된 값이 오는것을 확인했습니다!!!!!!)

 

앱이 해당 기능을 지원하지 않는 한 시스템에는 키가 포함되지 않습니다.

 

예를 들어 시스템에 remote notifications을 지원하지 않은 앱은 removeNotification 키가 포함되어 있지 않습니다.

 

 


 

후.. 오늘은 여기까지 봤는데요.. 

 

쉽게 정리하자면

1. Launch Storyboard를 제공한다! (예전에는 LaunchScreen이였던거 같은데.. storyboard로 바뀌었어요~)

2. 사용자에게 Launch storyboard를 보여주고 앱을 초기화 할 수 있다! 메서드 제공!

3. Launch Storyboard는 너무 길지 않게... 사용자에게 안좋은 경험을 줄 수있기때문에~  

4. 앱이 시작된 이유가 있으면 거기에 맞는 작업을 해줘야 한다? (제가 테스트해본 바로는 그냥 앱을 실행하면 launchOptions가 nil이네요.)

 

이정도네요. 영어를 못해서 이해가 안되는 부분도 있지만 재밌네요!

 

그럼 오늘은 여기까지 할게요~ 

 

ㅅㄱㄹ!