등장배경
앱이 scene을 지원한다면 13버전 이상의 iOS는 scene delegate를 사용하게 된다. (사용하지 않을 수도 있다.)12 이하의 시스템은 app delegate를 사용한다.
동작흐름
가. Scene 기반 흐름
전제환경: iPad에서 카카오톡(1)과 사파리(2)를 동시에 켜서 한 화면에 놓는다. 이때, 표시되고 있는 화면은 카카오톡 채팅 화면, 사파리 네이버(홈, 쇼핑) 접속 화면이다.
Scene을 지원하는 앱에서 UIKit은 라이프 사이클 이벤트가 발생할 때 각가 이벤트를 전달한다.(Scene은 실행되고 있는 앱 UI의 인스턴스 하나를 뜻한다.)
그래서 사용자는 동시에 각 앱(카카오톡, 사파리)에서 Scene을 생성할 수 있다. 이 Scene은 숨기거나 보일 수 있다. 각 Scene은 고유의 라이프 사이클을 가지고 있기 때문에 다른 실행상태 일 수 있다.
예를 들면 카카오톡 Scene(Foreground), 사파리 네이버 홈(Foreground - 작은 화면으로 앞에 둠), 사파리 쇼핑(Background - 큰 화면으로 홈화면의 뒤에 둠) 의 상태
사용자나 시스템이 앱에 새로운 Scene을 요청하면 UIKit은 Scene을 생성하고 Unattached상태로 둔다. 그리고 빠르게 Foreground Inactive(launch Screen) -> Active(App UI)로 전환되어 화면에 표시된다.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func sceneWillEnterForeground(_ scene: UIScene) {
print("포그라운드")
}
func sceneDidEnterBackground(_ scene: UIScene) {
print("백그라운드")
}
}
// 시뮬레이터로 화면을 띄우면 sceneDelgate에서 sceneWillEnterForeground 메소드의 프린트를 보여준다. 반대로 실행중인 앱에서 홈화면으로 돌아갈 경우 sceneDidEnterBackground 메소드를 실행한다. 이처럼 앱의 생애주기에 맞춰 메소드가 실행됨을 알 수 있다.
나. App 기반 흐름
#available, #unavailalbe
// if문
if #available(iOS 15, *){
print("지금 작성하는 코드는 iOS 15 또는 그 이상에서 적용 가능합니다.")
} else {
print("지금 작성하는 코드는 iOS 14 또는 그 이하에서 적용 가능합니다.")
}
#available vs. @available
@available(iOS 14, *)
final class descriptionAvilable{
print("적용이 가능합니다.")
}
사용자 인터페이스에 배경을 제공하고, 중요한 이벤트 처리 행동을 제공하는 객체이다.
스크린에 나타나는 모든 View는 Window에 묶여 있으며, 각 Window는 앱의 다른 View와 독립적이다. iOS앱은 모든 View들의 컨테이너 역할을 하는 UIWindow 인스턴스를 하나 갖는다. UIWindow는 UIView의 하위 클래스 이므로, Window는 그 자체가 View라고 할 수 있다.
예) Window - 액자, View - 액자에 넣은 사진
// SceneDelegate.swift
import UIKit
class SceneDelegate: UIResponde, UIWindowSceneDelegate {
var window: UIWindow?
// UIWindow를 확인해보자.
// @MainActor class UIWindow : UIView
}
(과제 세부 사항은 Notion에 작성하였음)
적용사항