티스토리 뷰

728x90
반응형

[1] 프로젝트 세팅

 

app target의 General settings 으로 가서 Supports multiple windows를 체크해주세요

 

 

 

이 옵션을 체크하면 XCode는 info.plist파일에서

Application Scene Manifest > Enable Multiple Windows를 yes로 바꿔줍니다.
이 key가 system에게 나의 앱이 multiple simultaneous scenes을 지원해!! 라고 알려주는 역할을 합니다. 

 

 

 

 

 

 

 

[2] 실험

 

이제 돌려보겠습니다. 

 

1. 앱을 처음 런치할때, 

 

AppDelegate.swift > application(_:didFinishLaunchingWithOptions:)

SceneDelegate.swift > scene(_:willConnectTo:options:) // UIWindowScene: 0x106c00580 UISceneSession: 0x281a58a00

SceneDelegate.swift > sceneWillEnterForeground(_:) // UIWindowScene: 0x106c00580

SceneDelegate.swift > sceneDidBecomeActive(_:) // UIWindowScene: 0x106c00580

 

 

 

2. 홈버튼 두번 눌러서 백그라운드 상태로 바꾸면 

 

SceneDelegate.swift > sceneWillResignActive(_:)

SceneDelegate.swift > sceneDidEnterBackground(_:)

 

 

3. 다시 포그라운드 상태로 바꾸면

 

SceneDelegate.swift > sceneWillEnterForeground(_:)

SceneDelegate.swift > sceneDidBecomeActive(_:)

 

 

 

4. 같은 앱을 하나 더 띄워서 split view로 놓으면

 

 

AppDelegate.swift > application(_:configurationForConnecting:options:)  // UISceneSession: 0x281ae9200

SceneDelegate.swift > scene(_:willConnectTo:options:)  // UIWindowScene: 0x106c00440 UISceneSession: 0x281ae9200

SceneDelegate.swift > sceneWillEnterForeground(_:) // UIWindowScene: 0x106c00440

SceneDelegate.swift > sceneDidBecomeActive(_:) // UIWindowScene: 0x106c00440

 

=> 새로운 UIWindowScene과 UISceneSession이 생겼다

 

 

 

 

5. 같은 앱을 하나 더 띄워서 slide over로 놓으면

 

 

 

AppDelegate.swift > application(_:configurationForConnecting:options:) // UISceneSession: 0x281ae4e00

SceneDelegate.swift > scene(_:willConnectTo:options:)  // UIWindowScene: 0x106f0d840 UISceneSession: 0x281ae4e00

SceneDelegate.swift > sceneWillEnterForeground(_:) // UIWindowScene: 0x106f0d840

SceneDelegate.swift > sceneDidBecomeActive(_:)  // UIWindowScene: 0x106f0d840

 

=> 새로운 UIWindowScene과 UISceneSession이 생겼다

 

 

 

 

6. slide over로 띄운 앱을 날리면

 

 

 

 

SceneDelegate.swift > sceneWillResignActive(_:) // UIWindowScene: 0x106f0d840

SceneDelegate.swift > sceneDidEnterBackground(_:) // UIWindowScene: 0x106f0d840

 

 

 

 

7. split로 띄운 앱을 날리면 

 

 

 

 

 


참고로 split 상태에서 하나를 날리면 없어지는 게 아니라 두개로 나눠져서 밀어버린 씬이 백그라운드 상태에 들어갑니다.

app switcher에 들어가보면 이렇게 두개로 나눠져있어요

 


 

 

SceneDelegate.swift > sceneWillResignActive(_:) // UIWindowScene: 0x106c00580

SceneDelegate.swift > sceneWillResignActive(_:) // UIWindowScene: 0x106c00440
SceneDelegate.swift > sceneDidEnterBackground(_:) // UIWindowScene: 0x106c00440
SeneDelegate.swift > sceneDidBecomeActive(_:) // UIWindowScene: 0x106c00580

 

 

split 모드에서 단일모드 전환할때 두 앱이 모두 resignActive 되었다가 

날리는 한 앱은 background로 들어가고

단일모드로 선택된 한 앱은 다시 becomeActive 되나봅니다.

 

 

 

 

8. 단일 모드가 되버린 앱에서 홈버튼을 두번 눌러 app switcher로 가게 된다면

 

SceneDelegate.swift > sceneWillResignActive(_:)  // UIWindowScene: 0x106c00580

 

 

 

9. app switcher에서 밑에 있는 앱(7번에서 백그라운드 상태로 만든 앱)을 날려서 없애면 

 

 

아무것도 안불림

 

 

 

10. 방금 갓 백그라운드상태로 들어간 하나 남은 이 앱을 날려서 없애면 

 

 

 

SceneDelegate.swift > sceneDidEnterBackground(_:) // UIWindowScene: 0x106c00580 

AppDelegate.swift > applicationWillTerminate(_:)

 

 

 

 

 

 

Architecting Your App for Multiple Windows 영상에서 

 

메모리 관리를 위해 시스템에서 앱을 날리면 이 메소드가 불리고

SceneDelegate.swift >  sceneDidDisconnect(_:)

 

 

사용자가 앱을 날리면 이 메소드가 불린다고 했는데 

AppDelegate.swift > application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>)

 

 

didDiscardSceneSessions 메소드 왜 안불리는 지 모르겠다 😭😭😭😭😭

반응형
댓글