본문 바로가기

Tech/iOS

[iOS] Day3 - 수업 정리

728x90

그저 빛... 잠시나마 깨달았다

 

수업이 끝난 후  1시간 정도 세션을 갖었는데 멘토님의 블로그 작성 팁을 들으며 잠시나마 깨달았다

같은 내용을 배우더라도 더 깊게 보고 싶게 써야겠다

언젠간 나도 zedd님 처럼..

부족한 점은 주말에 평일에 쓴 것을 회고하며 추가 해야겠다

오늘도 하루의 마무리 달려보자

 

앱의 생명주기

App의 생명 주기는 App의 실행 / 종료 및 App이 Foreground/Background 상태에 있을 때

시스템이 발생시키는 event에 의해 App의 상태가 전환되는 일련의 과정

 

Foreground 상태

앱이 화면에 올라와 있는 상태를 Foreground 

 

 

 

Background 상태

앱이 화면에 보이지 않지만 코드를 실행하고 있는 상태

 

App State

iOS 앱의 실행전 상태, 실행 후 상태 등을 알아보자

 

 

App State

1. Not Running

앱이 실행되지 않았거나, 앱이 시작되기 전 상태(메모리 상에 없다)

 

2. Inactive(Foreground)

앱이 실행되면서 Foreground에 진입하지만 어떠한 이벤트도 받지 않는 상태다

 

3. Active(Foreground)

앱이 실행 중, Foreground에 있다 활성화 상태이다

 

4. Background

앱이 화면에 보이지 않지만 코드를 실행하고 있는 상태이다. 예를 들어 스포티파이 App을 켜놓은 상태로 다른 App을 사용해도 

음악이 계속 재생되는 상태

 

5. Suspend

위의 예시에서 측정 앱에 해당된다. 앱이 Background 상태에 있지만 아무 코드도 실행하지 않는 상태

이 경우 앱은 메모리상에 있지만 아무 작업도 하지 않기 때문에 베터리를 사용하지 않는다

자전력 모드(베터리 적은 경우) or 메모리 부족 현상 발생 시 Suspend 상태의 앱은 메모리에 없어질 수 있다

ex) 금융 App

 

 

App State 도식화


iOS에서 앱을 실행시

1. UIApplication 객체 생성

2. @UIApplicationMain 또는 @Main 어노테이션이 있는 Class를 찾아 AppDelegate 객체 생성

3. Main Event Loop를 실행 (사용자의 Action을 받는 Loop)

 

Main Run Loop

유저가 행하는 이벤트를 처리하는 Process

UIApplication 객체는 앱이 실행될 때 Main Run Loop 실행

Main Run Loop를 View 와 관련된 이벤트에 활용되고 Main Thread에서 실행

1. 유저가 이벤트를 행한다 (화면 터치 같은 행위)

2. 시스템을 통해 이벤트 생성

3. UIKit Framework를 통해 생성된 port로 해당 이벤트가 앱으로 전달

4. 이벤트는 앱 내부적으로 Queue 형태로 정리되고 Event Queue에 쌓임

5. Event Queue에 있는 이벤트들이 Main Run Loop에 하나씨 매핑 됨

6. UIApplication 객체는 이때 가장 먼저 이벤트를 객체로 어떤 것이 실행되어야 하는지 결정한다

 


 

AppDelegate / SceneDelegate

App의 생명주기 상태에 따라서

AppDelegate / SceneDelegate에서 특정 메소드를 호출한다

 

iOS 12까지와 iOS 13 이상부터 동작이 달라진다

~iOS 12 : SceneDelegate 존재하지 않는다

iOS 13 ~ : SceneDelegate 존재

 

iOS 12까지 (Scene을 지원하지 않음)

Scene을 지원하지 않는 경우 모든 생명주기 관련 이벤트는 AppDelegate에 전달된다

AppDelegate 객체는 App의 모든 Window를 관리하기 때문에

앱의 상태 변화는 앱의 모든 UI에 영향을 미친다

 

iOS 13부터의 동작(Scene을 지원하는 경우)

SceneDelegate는 iOS13부터 추가된 클래스

SceneDelegate는 UI Life 를 관리하는 클래스

iOS 12까지는 하나의 앱의 하나의 윈도우만 가지기 때문에

AppDelegate 클래스가 UI Life Cycle 관리까지 했다

iPad상에서 여러개의 윈도우를 동시에 사용 가능해졌다

 

iOS13부터 iPadOS 등장으로 하나의 앱에 여러개의 윈도우를 동시에 사용할 수 있게 되었다

 

UI LifeCycle를 전담 관리해 줄 클래스가 필요해졌고 SceneDelegate가 추가되었다

 

Scene을 지원하는 경우 Scene 별로 별도의 생명주기를 가진다

하나의 앱은 여러개의 Scene을 가질 수 있으며 개별적으로 띄우거나 숨길 수 있게 되었다


 

 

#available / @available

@available

@available은 함수(메소드), 클래스 또는 프로토콜 앞에 놓인다

타입 또는 프로토콜이 적용되는 플랫폼 및 OS를 나태낸다

메소드를 버전 또는 플랫폼 별로 제한 

 

위의 예시처럼 iOS 13을 포함한 그 이상(*)의 버전에서만 scene을 호출 할 수 있다

 

 

클래스 전체를 @available 할 수 있다

 

만약 내 버전이 13보다 아래일 경우 

 

#available

#available은 서로 다른 논리 처리를 결정하기 위해서 if 또는 guard문과 같이 사용된다

Bool을 반환하는 런타입 검사

* 기입은 필수다!!

 

위와 같이 해당 버전을 포함하여 그 이상의 버전인지를 확인한다

 


Dark Theme

iOS 13 으로 오면서 새로 생긴 기능 

 

13이후 버전에서 다크모드가 설정이 안되는 경우

1. 스토리보드 상에서 custom color를 설정 한 경우 설정 안된다

-> system color로 설정하면 된다

2. Assets에서 New Color Set 설정시 다크모드에 특정 Color을 지정할 수 있다

빨간색 박스 부분에서 any, dark, light를 설정 할 수 있으며 다크모드가 아닐 때 Color을 지정할 수 있다

 

Any Appearance는 light, dark 모드를 다 지정할 수 있는데 왜 존재하는 걸까?

 

버전이 13보다 낮으면 다크 모드를 지정할 수 없기 때문에 Any Appearance의 Color가 나온다

 

3. 

전체 설정의 info에서 Apperance를 Dark로 설정해주자


 

가로모드

가로모드로 작업하고 싶다 어떻게 해야할까?

 

Projec에서 Portrait(세로모드 (기본설정)) 체크박스를 해제하고 Landscape Left, Landscape Right에 체크하자)

 

-> 가로모드가 설정이 안된다

 

General 에서 뿐만 아니라 Build Setting에서도 Iphone과 supported interface orientations의 상태를  Landscape Left, Landscape Right 로 설정해주면 가로모드가 된다

 


 

Code Snippet

내가 만드는 코드 백과사전 + 코드 백과사전

 

오른쪽 상단의 + 버튼을 누르면 창이 하나 나온다

 

snippets

버튼을 누르게 되면 code snippets이 창이 뜨고 코드를 직접 등록 가능하고 코드를 가져와서 쓸 수 있다

Version Controller는 공부를 하면서 내가 추가한 코드이다

 

단축키 -> cmd + shift + L

 


 

UIWindow 

UIWindow는 UIView의 부모가 아니다

UIView가 UIWindow의 부모다

 

UIWindow

사용자 인터페이스에 배경을 제공하고 중요한 이벤트 처리 행동을 제공하는 객체

스크린에 나타나는 모든 View는 Window로 묶여 있다

각 Window는 앱의 다른 View와 독립적이다

Window는 앱의 기본요소이지만 코드에서 최소한의 방식으로 상호작용한다

Window는 Viewcontroller를 사용하여 방향 변경을 구현하고 앱 작동의 기본요소인 다른 많은 작업을 수행

 

iOS 모든 View들의 컨테이너 역할 -> UIWindow

UIWindow는 인스턴스를 하나 가진다 UIWindow는 UIView의 하위클래스 이므로 Window는 그 자체가 View라고 할 수 있다

Window에 추가한 View를 SubView라하는데 이 Window의 SubView 또한 SubView를 가질 수 있다

Window를 엘범이라 하면 View 엘범 안에 사진이라 생각하면 된다

'Tech > iOS' 카테고리의 다른 글

[iOS] Day 5 - Xcode에서 Github 연동하기  (0) 2022.07.08
[iOS] Day4 - 수업정리  (0) 2022.07.07
[iOS] Day 3 - UITextField 활용  (0) 2022.07.06
[iOS] Day 2 - Storyboard 상에서 Button 활용  (0) 2022.07.05
[iOS] Day 2 - 수업 정리  (0) 2022.07.05