앱을 구성하는객체


  • 시스템 객체
    • 자동 생성
    • 시스템 관련 동작
    • 코드 수정 불가
    • UIApplication, UIwindow
  • 커스텀 객체
    • 업무 관련 동작 작성
    • 개발자 작성, 수정 가능
    • ApplicationDelegate, ViewController, Model

애플리케이션 객체

  • 애플리케이션 객체
    • 시스템 객체 : 애플리케이션(UIApplication)
    • 앱의시작과 함께 자동생성
    • 유일한 객체로 존재(앱에 1개)
  • 객체 얻기
class var shared: UIApplication { get }
  • 역할
    • 애플리케이션의 고수준 행위
    • 컨트롤 객체에게 이벤트 처리 배치
    • 푸쉬/로컬 노티
    • 앱URL과 앱 전환

애플리케이션 델리게이트

  • 애플리케이션 델리게이트
  • UIApplicationDelegate 프로토콜
  • 프로젝트 생성 시 AppDelegate 클래스
  • 애플리케이션 델리게이트 객체도 유일하게 존재(앱애 1개)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
  • 역할
  • 앱의상태변화
  • 푸쉬/로컬 노티 다루기
  • URL을 이용한 앱 오픈
  • 앱 공유 데이터 저장 용도로 사용가능

UIWindow

  • 시스템 객체
  • 화면에 출력되는 뷰를 조율
  • 대부분 1개의 윈도우 객체. 외부 스크린이 있으면 추가 윈도우 객체
  • 루트뷰 컨트롤러: 윈도우에 뷰를 제공하는 뷰 컨트롤러
var rootViewController: UIViewController?
  • 앱 델리게이트에서 윈도우 접근
UIApplication.shared.delegate?.window

앱의 상태


  • 앱의 주요 상태
    • 동작 안 함(Not running): 앱이 종료되거나 시작되지 않은 상태
    • 포그라운드(Foreground): 앱이 화면에 나타나고 동작중인 상태
      • 앱이 화면에 나타나는 상태 Active, Inactive
      • Active: 사용자 이벤트 전달
      • Inactive
        • 사용자 이벤트 전달 안됨
        • 다른 코드 동작 중(예: 컨트롤 센터, 알림 센터)
        • 포그라운드와 백그라운드 전환 중인 상태
    • 백그라운드(Background): 화면에 보이지않지만(제한된) 동작중인 상태
      • 사용자가 홈 버튼을 눌러서 화면에 앱이 보이지않는 상태
      • 백그라운드동작: 음악재생, GPS, voip등 제한된 동작 수행 가능
      • Suspended 상태로 전환되는 중간 단계로 앱 상태 저장
    • 서스펜디드(Suspended) : 메모리에 존재하지만 동작중이 아닌 상태
* 앱의 상태 전환 UIApplicationDelegate 첫구동
func applicationDidFinishLaunching(_ application: UIApplication)

* 포그라운드(foreground)
func applicationDidBecomeActive(_ application: UIApplication)

* 백그라운드(background)
func applicationDidEnterBackground(_ application: UIApplication)

* 포그라운드, 백그라운드 상태 전환 과정, Inactive
func applicationWillEnterForeground(_ application: UIApplication) 
func applicationWillResignActive(_ application: UIApplication)

*  종료(Suspended 상태에서 종료시 동작 안함)
func applicationWillTerminate(_ application: UIApplication)

tabBarController Delegate 팁

tabBarController의 Delegate를 AppDelegate에 설정합니다. tabBarController Delegate를 각 ViewController에서 실행하는것보다, 좀더 편안하게 관리할수 있습니다.

class AppDelegate: UIResponder, UIApplicationDelegate, UITabBarControllerDelegate { 
    var window: UIWindow?
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let tabBarController = window?.rootViewController as! UITabBarController
    tabBarController.delegate = self
    return true 
    }

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    // 탭 선택 이벤트 

    }