iOS 앱의 생명주기
앱이 포그라운드 또는 백그라운드에 있을 때 시스템 알림에 응답하고 다른 중요한 시스템 관련 이벤트를 처리합니다.
- Unattached (분리됨):
- 앱이 아직 실행되지 않은 상태입니다.
- 마치 잠들어 있는 상태와 비슷합니다.
- 이 단계에서는 아무 작업도 할 수 없습니다.
- Foreground Inactive (전면 비활성):
- 앱이 화면에 보이지만 아직 사용자 입력을 받지 않는 상태입니다.
- 알람이 울려 막 깨어난 상태와 비슷합니다.
- 이 단계에서 할 수 있는 일:
- 화면 구성 요소 준비 (예: 아침에 옷 고르기)
- 필요한 데이터 로드 (예: 오늘의 일정 확인하기)
- Foreground Active (전면 활성):
- 앱이 완전히 활성화되어 사용자와 상호작용할 수 있는 상태입니다.
- 깨어나서 하루를 시작한 상태와 비슷합니다.
- 이 단계에서 할 수 있는 일:
- 사용자 입력 처리 (예: 메시지에 답장하기)
- 애니메이션 실행 (예: 운동하기)
- 네트워크 요청 (예: 친구에게 전화하기)
- Background (배경):
- 앱이 화면에 보이지 않지만 여전히 작업을 수행할 수 있는 상태입니다.
- 잠들어 있지만 꿈을 꾸는 상태와 비슷합니다.
- 이 단계에서 할 수 있는 일:
- 데이터 동기화 (예: 잠들어 있어도 심장이 뛰는 것처럼)
- 위치 업데이트 (예: 수면 중 몸의 위치가 바뀌는 것처럼)
- 음악 재생 (예: 백색 소음을 들으며 자는 것처럼)
- Suspended (일시 중단):
- 앱이 메모리에 남아 있지만 아무 작업도 수행하지 않는 상태입니다.
- 깊은 잠에 빠진 상태와 비슷합니다.
- 이 단계에서는 작업을 수행할 수 없습니다.
앱은 이러한 상태들 사이를 필요에 따라 전환합니다. 예를 들어:
- 앱을 실행하면 Unattached → Foreground Inactive → Foreground Active로 전환됩니다.
- 홈 버튼을 누르면 Foreground Active → Background → Suspended로 전환될 수 있습니다.
- 알림을 받으면 Foreground Active → Foreground Inactive → Foreground Active로 잠시 전환될 수 있습니다.
각 전환 시점에 적절한 작업을 수행하도록 앱을 설계하면, 사용자에게 더 나은 경험을 제공할 수 있습니다.
예를 들어, Background 상태로 전환될 때 중요한 데이터를 저장하거나, Foreground Active 상태로 돌아올 때 최신 정보를 로드하는 등의 작업을 수행할 수 있습니다.
iOS 앱의 생명주기를 하루 동안의 사람의 활동과 비교해 볼 수 있습니다:
- Not Running (잠자는 상태):
- 앱이 아직 시작되지 않았거나 완전히 종료된 상태입니다.
- 마치 여러분이 깊은 잠에 빠진 것과 같습니다.
- Inactive (막 일어난 상태):
- 앱이 실행 중이지만 아직 사용자 입력을 받지 않는 상태입니다.
- 알람이 울려 깼지만 아직 눈을 비비고 있는 상태와 비슷합니다.
- Active (활발히 활동하는 상태):
- 앱이 화면에 표시되고 사용자와 상호작용하는 상태입니다.
- 여러분이 하루 동안 열심히 일하거나 활동하는 것과 같습니다.
- Background (백그라운드 작업 상태):
- 앱이 화면에 보이지 않지만 여전히 일부 작업을 수행하는 상태입니다.
- 잠들기 전 알람을 맞추거나, 잠든 동안에도 심장이 뛰는 것과 비슷합니다.
- Suspended (일시 정지 상태):
- 앱이 백그라운드에 있지만 아무 작업도 하지 않는 상태입니다.
- 깊은 잠에 빠져 있지만 언제든 깨어날 수 있는 상태와 유사합니다.
iOS 13 이후 scene-based life cycle events
iOS 13 기점으로 이전에는 life-cycle events를 AppDelegate에서 모두 다뤘지만,
iOS 13 이후에는 SceneDelegate가 등장하는데,
앱의 생명주기와 프로세스 이벤트는 여전히 AppDelegate가 관리하지만,
UI 생명주기는 새로운 SceneDeelgate가 담당한다.
한 개의 Scene은 사용자가 기기에서 실행하는 앱의 UI를 나타내는 하나의 인스턴스를 뜻합니다.
이 전에는 1개의 앱이 1개의 인스턴스를 가지고 있기 때문에, 앱이 실행 중인 동안에는 1개의 UI만 사용할 수 있습니다.
iOS 이후부터는 멀티플 윈도우를 지원하면서 하나의 앱이 여러 개의 Scene 인스턴스를 가질 수 있습니다.
각 Scene은 자체적으로 생명주기를 갖고 있고, 앱은 1개 이상의 SceneDelegate를 가질 수 있게 구성됨으로써 이를 통해 각 Scene은 독립적으로 UI 상태를 관리하고, 사용자는 멀티 윈도우 환경을 제공 받을 수 있습니다.
주요 변화:
- 멀티태스킹 지원 향상: 하나의 앱이 여러 장면을 동시에 활성화할 수 있습니다.
- 더 세밀한 제어: 각 장면의 상태를 개별적으로 관리할 수 있습니다.
- 향상된 사용자 경험: 아이패드에서 같은 앱의 여러 인스턴스를 동시에 실행할 수 있습니다.
예를 들어, iOS 13 이후에는 메모 앱의 두 개의 다른 노트를 분할 화면으로 동시에 볼 수 있습니다. 각 노트는 독립적인 장면으로 처리되며, 각각 자신만의 생명주기를 가집니다.
하지만 iOS 13 이전 버전과의 호환성을 위해, 애플은 두 시스템을 모두 지원합니다.
개발자는 앱의 최소 지원 버전에 따라 적절한 방식을 선택하거나 두 방식을 모두 구현할 수 있습니다.
'iOS > Swift' 카테고리의 다른 글
왜 DispatchQueue.main을 tableView(_ : cellForRowAt: )에 안 넣었나? (0) | 2024.08.20 |
---|---|
handshake failed at state 12288: not completed (0) | 2024.08.18 |
Swift에서 옵셔널이란 무엇이며, 언제 사용해야 하나요? (0) | 2024.08.16 |
델리게이트 패턴이란? (0) | 2024.07.08 |
영어 단어 중에 첫 번째 글자를 대문자로 하고 나머지는 소문자로 처리하는 함수 (0) | 2024.07.04 |