AppDelegate가 궁금하다..!?
2020/08/20 - [iyOmSd/Title: iOS Think🤔] - iOS - App Life Cycle
이번엔 SceneDelegate에 대해서만 볼거에요
iOS13 부터 새로생긴 개념이에요
이기능은
아이패드를 사용할 때
앱을 분할해서 여러개를 띄울 수 있죠??
그기능이 생기면서 생긴 Delegate입니다!!
이렇게 말이죠!
앱과 다른 앱을 한 화면에 동시에..!
이게 새로생겼다고 해서 기존의 AppDelegate를 사용하지 말라는건 아니에요
아이폰에서는 저 기능이 지원되지않으니까
SceneDelegate와 관련된 모든 함수, 파일, plist속성을 지우면 사용 할 수 있어요
삭제하지않고 사용한다면
iOS13이상이라면 라이플사이클이 Scene기반으로 동작해요
전에는
AppDelegate가
프로세스의 라이프사이클과 UI 라이프사이클을 담당했고
아래서 위로 올리면 여러화면이 보이는 그런 창이 뜬다면
하나하나가 앱을 나타냈엇죠
그 중 UI 라이프사이클을 Scene으로 분리하면서
AppDelegate의 함수가 Scene으로 옮겨가면서 이름이 살짝 바뀐게 보이죠?
비슷해보이는것은 기능이 같아요
세션 라이플사이클의 개념이 새로 생겼어요
아래와같이 앱을 실행하면
AppDelegate가 실행되고
Session을 생성하기전에 설정을 하구요
session에대한 Configuration을 설정해주는 곳인데
동적으로 정의하거나 plist에서 정적으로 정의할 수 있어요
디폴트로 값이 지정되어있구요 plist에서 확인 할 수 있어요
세션이 연결되고
앱이 떠요
하지만
아무설정없이 Scene기반의 앱을 실행했다면
까만화면을 볼 수 있어요
간단하게 화면을 설정해주는 로직을 넣어줬어요
이제 앱이 보이실거에요 :)
분할 화면을 만들 때는 프로젝트 설정에서 multiple windows를 설정해줘야하구요
실행동작
앱실행 과정을 살펴보면
처음으로 앱을 실행하면
AppDelegate에서 항상보던 함수가 실행되고
SceneDelegate에서 session이 연결됫다고 실행되는게보이죠?
그뒤에는 앱이 보이는과정이니까
willForeground
didBecomActive
이상태에서 스와이프를 해서 분할창을 만들어볼게요
분할창을 하기위해선 아이패드 시뮬에
디바이스 베젤이 있어야해요
그래야 아래서위로 스와이프하면서 Switcher을 꺼낼수 있어요
끌어서 옆에 하나더 띄워봤어요
실행되는 함수가 달라진게 보이나요?
처음에 이제 AppDelegate함수에서
앱시작을 알리는 함수가아니라
세션을 설정하는 함수가 실행됬어요
새로운 scene을 만들때 configuration data를 반환 받는다.
앱이 최초실행 될때만
didFinishLaunchingWithOptions
가 실행되고
그이후에는
configurationForConnecting
가 실행되서 configuration정보를 받고 프로세스를 공유하는거에요
무슨 말이냐면
화면을 위로 올리면
(설정, 분할앱)으로 2개의 영역이 존재하죠??
분할앱에는 2개의 앱이 실행되고 있구요
즉 하나의 프로세스
전에는 하나의 앱이 하나의 프로세스라서
앱마다 창이 보였지만 이젠 아니죠!!
하나의 프로세스를 가지고 있는건 그대로고
여러 Scene Session을 가지고 있을 수 있어요
AppDelegate가 Session 라이프사이클을 관리한다고 했잖아요??
다시 돌아와서!!
앱을 올린상태에선
띄워진 앱이 2개라서
2번호출되구요
다시 원래 화면으로 돌아오면
이 정도는 예측할 수 있죠?? 이제 ㅎㅎ
하나의 창을 종료해볼게요
창을 잡고 움직이는순간
분리된 앱 - ResignAcitve
종료 가능한 상태가되면 분리되지않은 큰 화면가 흐려지면서 ResignAcitve
함수가 실행되는 시기가 달라요
아무튼 2번 실행되구요
종료하면
Disconnect
세션이 종료됫구
다시 큰 화면이 포커싱 되므로
BecomeActive가 실행되네요
아예 홈화면으로 나오면
ResignActive
다음에
Background로 가기전!
현재 활동상태를 저장할 수 있어요
디폴트로 구현된 함수는 아니고 구현해줘야해요
백그라운드로 가서 메모리가 모자란다면 종료될 수 있잖아요?
그 때 활동을 저장 해줄 수 있는 기능이에요
다시 앱으로 돌아오면
마지막으로 앱을 모두 종료하면
마지막에 떠야하는
sceneDidDisconnect와
didDiscardSceneSessions이 로그에 뜨진 않네요
왜인지 알아보니...
didDiscardSceneSessions는
scene session이 제거되었을 때 불리는 함수구요
문서를 보니
app switcher을 통해서 종료가 된경우 호출되고
앱이 실행되고 있지않다면 다음 앱을 시작할 때 이 메소드가 실행된다라고 하네요
앱을 종료하고 시작할때 보면
가끔 뜨긴해요!!
종료된 scene에 특정 리소스를 해제할때 사용할 수 있다고하네여요
sceneDidDisconnect는
scene연결 해제시 호출되는 함수구요
scene이 해제 되었지만
세션이 제거되지 않았다면 scene이 다시 연결 될수도 있어요
'iyOmSd > Title: Swift' 카테고리의 다른 글
[Swift] Custom View 만들기 (1) | 2020.11.12 |
---|---|
[Swift] iOS 프레임워크 구조 (0) | 2020.11.11 |
[Swift] WKWebView 앱 죽는 오류 현상 (0) | 2020.10.25 |
[Swift] Firebase Crashlytics dSYM 누락 업로드 (0) | 2020.10.25 |
[Swift] iOS 파일구조 알아보기 Sandbox, Bundle - 파일시스템(APFS) (1) | 2020.10.23 |