앱의 흐름?

주방·2022년 7월 6일
0

Swift

목록 보기
2/17

#1. Checklist

  • AppDelegate / SceneDelegate
  • #available, #unavailable / @available
  • Dark Theme
  • Build Setting
  • Debug View Hierarchy
  • Code Snippet
  • UIWindow
  • UITapGestureRecognizer

1) AppDelegate / SceneDelegate

  1. 등장배경

    • iOS 12와 그 이전버전에서는 앱에 대한 관리를 UIApplicationDelegate(AppDelegate) 객체를 통해 라이프 사이클을 관리했었다. (이때, 관리 기기는 iPhone에 한정되었다.)
      • 라이프 사이클의 구성
        • not Running - Active(Foreground) - Inactive(Foreground) - Background(Background) - Suspended
    • 그런데, iOS 13버전 이후터 iphone외 iPad도 추가 되면서 라이프 사이클 관리에 대한 다른 방식이 요구되었다. iPhone의 경우 한 화면에서 하나의 앱이 표시됨에 따라 AppDelegate에서의 동일한 라이프 사이클 적용 및 관리가 가능했다.
    • 그러나 iPad에서는 하나의 앱만 구현이 되는 것이 아니라, 동시에 한 화면에서 2가지 이상의 앱이 실행이 되는 것이다. 앱의 상태를 적절하게 조절해주기 위해 UISceneDelegate 객체를 도입하였다.

    앱이 scene을 지원한다면 13버전 이상의 iOS는 scene delegate를 사용하게 된다. (사용하지 않을 수도 있다.)12 이하의 시스템은 app delegate를 사용한다.

  2. 동작흐름

    • 가. 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 기반 흐름

    • Scene에 비해 흐름이 더 단조롭다.
    • App delegate 는 분리된 스크린에 표시되는 것까지 포함해 앱의 모든 window를 관리한다.
    • 결과적으로 앱 상태 전환은 외부 디스플레이에 표시되는 컨텐츠를 포함해 앱의 전체 UI에 영향을 준다.
    • 라이프 사이클의 구성
      • not Running - Active(Foreground) - Inactive(Foreground) - Background(Background) - Suspended

2) #available, #unavailable, @available

  1. #available, #unavailalbe

    • 등장 배경: 앱 개발 환경에서 플랫폼 또는 버전별로 코드 조각을 사용 가능 또는 사용 불가능을 확인해야 한다. 새로운 Swift 버전이나 플랫폼 버전에 따라 적용 여부를 확인해야 한다. 이때, 버전별 지원 가능 여부를 확인할 수 있다.
    // if문
    if #available(iOS 15, *){
      print("지금 작성하는 코드는 iOS 15 또는 그 이상에서 적용 가능합니다.")
    } else {
      print("지금 작성하는 코드는 iOS 14 또는 그 이하에서 적용 가능합니다.")
    }
  2. #available vs. @available

    • @available: 클래스 또는 메서드에서 적용이 되는 것을 표시하는 데 사용된다.(넓은 범위)
    • #available: 특정 플랫폼, 버전에 대한 코드 조각을 확인한다.(좁은 범위)
    @available(iOS 14, *)
    final class descriptionAvilable{
      print("적용이 가능합니다.")
    }

3) UIWindow

  • UIWindow란?

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

    • 스크린에 나타나는 모든 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
    }



#2. Assginment

(과제 세부 사항은 Notion에 작성하였음)

Assignment - Netflix Project

  • 적용사항

    • SignUpViewController 생성 후 해당 Scene의 UILabel, UITextField, UIButton, UISwitch 추가 후 적절하게 속성 변경하였음.
    • 초기화면 정보 클릭 후 다음 뷰로 연결


#3. 회고

  • Assignment - Netflix Project SignUp 구현하기
    • 각 UITextField, UIButton, UISwitch 버튼을 구현하는데 있어 중복되는 코드가 있어 이를 각 버튼별 메소드를 구분하여 작성하고, for문으로 반복되는 표현을 최소화하고자 하였음.
    • 그러나 ViewController 안에 메소드가 쌓여 있어 무척 보기 좋지 않음.
    • 회원가입 버튼 클릭시 조건을 추가하는 과제를 진행을 위해, UITextFieldDelegate를 이용해 각 텍스트 필드에 공란에 따른 조건을 주고자 하였음.
    • 그러나 세부 조건을 입력하는데, if문의 형태가 계속 반복되어 코드가 지저분해졌음. 우선적으로 구현하지 않고, 단락평가(Short-Circuit Ecaluation)에 대해 학습하고 적용을 해보고자 함.

0개의 댓글