[iOS] Preparing your UI to run in the foreground

Hyunndy·2023년 2월 19일
0

iOS-App-Structure

목록 보기
3/8

🐸

저번 글에서는 앱이 launch되며 launchScreen이 뜨는 동안 AppDelegate에서 처리할 수 있는 작업에 대해 학습했는데요.
오늘은 그 다음 단계인
Preparing your UI to run in the foreground을 학습하겠습니다.


개요

UI를 화면에 나타내기 위해 foreground 전환을 사용합니다.
foreground로의 앱 전환은 주로 유저 액션에 대한 응답입니다. 예를 들어, 유저가 앱의 아이콘을 터치했을 때 시스템은 앱을 시작하고 foreground로 전환시킵니다.
앱의 UI 업데이트, 리소스 요청, 유저의 요청을 핸들링하는 서비스의 시작을 위해 foreground로의 상태변환을 사용할 수 있습니다.

UIKit에서의 모든 App State Transition은 delegate object에 적절한 notification을 보냅니다.

iOS 13 이상: UISceneDelegate
iOS 12 이하: UIApplicationDelegate (= AppDelegate)

Delegate 객체를 둘 다 사용할 수 있지만, UIKit은 가능하다면 항상 Scene Delegate를 사용합니다.
UIKit은 foreground로 입장하는 특정한 scene과 연관된 Scene Delegate에만 noti를 보냅니다.
자세한건 Specifying the scenes your app supports이 글을 확인하세요.


Update your app’s data model when entering the foreground

launch 할 때, 시스템은 foreground 상태로 전환하기 전에 App을 Inactive 상태로 시작합니다.
App의 launch-time Method인 이 함수들을 활용해 해당 시점에 진행해야 할 작업을 할 수 있습니다.

app이 Background에 있었다면 UIKit은 이 함수들을 호출하면서 App을 Inactive 상태로 전환합니다.

/// Scene Support App 
func sceneWillEnterForeground(_ scene: UIScene) { .. }

/// 다른 모든 App
func applicationWillEnterForeground(_ application: UIApplication) { ... }

정리하자면 위 함수는

  • App이 처음 launch 되어 Inactive 될 때
  • Background 상태에서 Inactive 될 때

호출됩니다.

Background에서 foreground로 전환될 때, 이 함수를 사용해서 네트워크로 부터 데이터를 fetch하고 disk로부터 리소스를 로드 할 수 있습니다.


Configure your user interface and initial tasks at activation

시스템은 앱의 UI를 띄우기 직전에 앱을 Active 상태로 전환합니다.
이 때는 앱의 UI를 구성하고 런타임에 해야할 일을 세팅하기에 좋습니다.

또는, Background에서 다시 Active 상태가 될 때 UI를 refresh 시키고 멈췄던 Task를 재개할 수 있습니다.

디테일하게 보면...

  • (필요하다면) App의 Window를 표기합니다.
  • (필요하다면) 현재 보이는 ViewController를 변경합니다.
  • 데이터나 뷰, 컨트롤의 State를 업데이트 하기
  • 중단된 게임이 재개 컨트롤 표기하기
  • Task를 실행하기 위해 Dispatch Queue를 시작하거나, resume 하기
  • Data source 객체 업데이트 하기
  • 기간제 Task를 위해 타이머 시작하기

위 작업은 이 메서드에서 수행할 수 있습니다.

func sceneDidBecomeActive(_ scene: UIScene) { ... }
func applicationDidBecomeActive(_ application: UIApplication)  { ... }

앱 실행 시점은 유저에게 보여질 UI를 완성하는 시점입니다.
이 때 activation 메서드를 block할만한 작업을 하면 안됩니다.

예를들어, 만일 데이터가 App의 바깥에서 주로 변경된다면 App이 Foreground로 돌아오기 전에 네트워크로부터 fetch update를 하기 위해 background Task를 사용하십시오.
아니면, 비동기적으로 데이터를 fetch 하는 동안 보여줄 existing 데이터를 준비하는게 좋습니다.


Start UI-specific tasks when your view appears

activation 메서드가 끝나면, UIKit은 visible한 Window를 보여줍니다. 또한 Appear되는 View들과 연결된 ViewController에 notificatio을 보냅니다.
UI 업데이트의 마지막 과정을 위해 ViewController의 viewWillAppear(_:) 함수를 사용하세요.

예를들면

  • 적절한 UI 애니메이션 시작
  • 자동 재생이 활성화된 경우, 미디어 파일 재생

이 시점에 ViewController를 변경한다던가, UI에 중요한 변경을 하면 안됩니다.
viewController가 화면에 Appear되는 시점은 UI가 확실히 준비된 상태여야 합니다.


마무리

이번 글은 foreground 상태(Inactive & Active) 상태에서 실행할 UI를 준비하는 과정이었습니다.

정리하자면...

  • launch -> Inactive
  • Background -> Inactive
/// Scene Support App 
func sceneWillEnterForeground(_ scene: UIScene) { .. }

/// 다른 모든 App
func applicationWillEnterForeground(_ application: UIApplication) { ... }
  • Inactive -> active
func sceneDidBecomeActive(_ scene: UIScene) { ... }
func applicationDidBecomeActive(_ application: UIApplication)  { ... }

UI 준비 완료!

func viewWillAppear(_:)
profile
https://hyunndyblog.tistory.com/163 티스토리에서 이사 중

0개의 댓글