iyOmSd/Title: Swift

[Swift] SceneDelegate

냄수 2020. 11. 4. 18:04
반응형

 

AppDelegate가 궁금하다..!?

2020/08/20 - [iyOmSd/Title: iOS Think🤔] - iOS - App Life Cycle

 

iOS - App Life Cycle

앱의 생명주기에 대해서 알아볼거에요 우선 iOS13을 기준으로 최신버전에는 SceneDelegate라는 파일이 생성되는게 보일거에요 새로운 개념이죠 다음에 알아보도록하구요! 지금은 AppDelegate 위주의 단

nsios.tistory.com

 

 

 

이번엔 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이 다시 연결 될수도 있어요

 

 

 

 

 

반응형