TIL
🌱 난 오늘 무엇을 공부했을까?
📌 iOS App Life Cycle
📍 1. iOS 13에서 Scene Delegate로 이관된 App Delegate의 역할
📍 2. App Delegate와 Scene Delegate의 각각의 역할
- App Delegate
- 앱에 영향을 주는 공통된 동작들을 관리
- 앱의 중심 데이터구조를 초기화한다
- 앱의 scene을 구성한다
- 메모리 경고, 다운로드 완료 등 앱 외부에서 오는 알림에 대해 응답한다.
- 앱의 scenes, views, view controllers 관련이 없는 앱 대상으로 하는 이벤트에 응답한다.
- launch타임에 요구되는 서비스를 등록한다, apple 푸쉬알림 서비스처럼
- Scene Delegate
- 화면의 갱신, 생명주기를 관리
- UISceneDelegate 객체를 사용하여 앱 사용자 인터페이스의 하나의 인스턴스에서 수명 주기 이벤트를 관리합니다.
- 이러한 인터페이스는 scene이 foreground에 진입하여 활성화될때와 background에 진입할때를 포함하여 scene에 영향을 미치는 상태 전환에 응답하는 방법을 정의합니다.
- 이러한 전환이 발생할때 delegate를 이용하여 적절한 동작을 제공하십시오.
- 예를 들어 중요한 작업을 수행하고 앱이 background로 전환될때 앱을 조용하게 만듭니다.
📍 3. Scene의 개념이 생긴 이유는 무엇이고, 언제 어디서 활용할까
- 각 scene별로 별도의 처리를 해주기 위해서 ?
- HackMD를 앱으로 만든다고 생각하면 하나의 화면에는 작성만 하고, 다른 하나의 화면에서 Markdown 언어를 해석해서 띄어준다?
📍 4. 앱은 언제언제 Foreground Inactive 상태가 될까, 2가지 이상의 사례
- Foreground Inactive
- 앱이 포그라운드에서 실행 중이지만 이벤트를 수신하지 않는다.
- foreground <-> background 사이 상태전환이 될 때 사이에 foreground-inactive 상태가 된다
- 앱 실행 중 전화가 왔을 때 , 기존 앱이 background로 가기 전에 foreground-inactive 상태를 거친다
- 전화를 마치고 다시 기존 앱이 foreground로 돌아올 때 foreground-inactive 상태를 거친다
📍. 앱의 상태가 Background로 지속되기 위한 요건은 무엇일까
- 흐름이 끊기지 않아야 하는 중요한 작업일 경우 시스템에 그 이유를 알리고, info에 설정해줘야 한다.
Consider this approach if your app needs to finish sending a message or complete saving a file beginBackgroundTask(withName:expirationHandler:)
to alert the system.
참고
📍 Respond to Scene-Based Life-Cycle Events
🔗 Foreground, Background
- Suspended
- 앱이 Background 이동하고 잠시 후 동작을 멈춘 상태
- Background
- 앱이 간단한 동작은 하지만 실제로 사용자에게 보여지는 상태가 아님
- 특정 메서드를 호출해서 시스템에 Background 에서도 동작이 필요함을 알려야한다.
- beginBackgroundTask(withName:expirationHandler:)
- Unattached
- 앱의 뷰가 그려졌지만, 화면에 나타나기 전의 상태
- 연결되지 않은 상태
- Foreground Inactive
- 앱이 그려졌고 화면에 나타났으나, 사용자의 이벤트를 처리하지 않는 상황
- 두 가지의 경우가 대표적이다
- 액티브 되기 전과 백그라운드로 가기 전
- 그 외의 상황은 특정 이벤트로 인해 발생되는거 같다 - 예)아이폰 설정화면을 켜기 위해 화면을 쓸어내릴 때 등등
- 앱 캡처를 통해 상태를 저장하면 다시 동작하는 상황에서 기존 화면이 나타남
- Foreground Active
- 앱이 화면에 나타나고 사용자의 이벤트를 기다리는 상황
🔗 UISceneDelegate
- iOS 13 이후로 Scene 기반 앱의 수명주기 이벤트를 담당하는 Delegate
- Connecting and Disconnecting the Scene
func scene(UIScene, willConnectTo: UISceneSession, options: UIScene.ConnectionOptions)
- 앱의 scene 추가에 대해 대리자에게 알림.
func sceneDidDisconnect(UIScene)
- 앱에서 UIKit이 scene을 제거했음을 대리자에게 알림.
class UIScene.ConnectionOptions
- UIKit이 scene을 생성한 이유에 대한 정보를 포함하는 데이터 객체.
- Transitioning to the Foreground
func sceneWillEnterForeground(UIScene)
- scene이 foreground에서 실행되기 시작하고 사용자에게 보여지게될 것임을 대리자에게 알림.
func sceneDidBecomeActive(UIScene)
- scene이 Active되었으며 이제 사용자 이벤트에 응답하고 있음을 대리자에게 알림.
- Transitioning to the Background
func sceneWillResignActive(UIScene)
- scene이 inactive 상태로 간다고 대리자에게 알림.
func sceneDidEnterBackground(UIScene)
- scene이 background에서 실행 중이며 더 이상 화면에 표시되지 않음을 대리자에게 알림.
Respond to App-Based Life-Cycle Events는 iOS 12 이전 버전이나 scene을 지원하지 않는 App을 개발할 때 참고하면 좋을거 같다.
참고 : 공식문서