본문 바로가기
개발 블로그/아이폰개발

[iOS] App Lifecycle( 앱 생명주기)

by snapshot 2019. 11. 27.

앱을 개발하다 보면 앱의 생명주기에 따라 어떤 작업을 해야 할 때가 있다. 

뭐 기본적으로 앱을 처음 실행시 기본적으로 라이브러리 세팅 등을 해준다. firebase 나 userhabit, ga, 기타..등등

  • 앱의 기본적으로 필요한 세팅
  • 서드파티 라이브러리 세팅 (Firebase, UserHabit, GA)

 

이런 세팅후 서버 통신을 통해서 앱에 대한 설정값, 또는 version 체크를 통한 강제 업데이트 여부 등을 통해서 정말 이 버전에서 실행을 해도 되는 조건이 맞는지도 체크를 한다.

  • 서버 통신 후 실행 가능한지 여부 체크
  • 서버 통신 후 앱의 기본정보 세팅 
  • Version 체크 (강제 업데이트 여부)

 

 

또는 (홈버튼..아 없어졌나..) 하이튼 홈 화면으로 나갔을때 서버에 앱에 대한 정보를 저장해야 할 내용이 있으면 통신을 통해서 서버에 저장을 해준다. DB가 있다면 DB에도 저장을 해주고 닫아준다. 홈으로 들어갔다고 해서 앱이 바로 종료 되는 것이 아니기 때문에 가능하다 .

  • 서버 통신을 통한 앱의 현재 상태 전송 저장
  • DB가 있을 경우 데이터 저장

 

그리고 다른 백그라운드나 다른 앱을 실행하고 다시 나의 앱이 실행됐을때도 체크가 가능하다. 이 때에는 혹시 바뀌었을지 모르는 유저 정보나 세팅, version 체크, 그리고 현재 실행화면이 실시간 동적으로 변화는 화면일 경우 새로운 데이터 갱신 (화면에서 notification을 통해서 세팅 가능) 등을 해줄 수도 있다. 아 그리고 비밀번호가 필요한 앱일 경우에는 화면에 들어오기 전에 다시 비밀번호 체크 화면을 보여줄 수도 있다. 이건 백그라운드 들어갈 때 해줘도 되나..

  • 새로 갱신된 유저 정보나 앱 세팅 정보 확인
  • version 체크 (강제 업데이트 여부) 
  • 보이는 화면의 갱신 여부 (채팅이나 동적으로 변하는 리스트일 경우 필요)
  • 비밀번호가 있는 앱일 경우 화면 보여줌

 

그럼 간단하게 어떤 생명주기가 있는지 알아보자. 

 

  • Not Running
    • App이 아직 실행되지 않았거나 완전히 종료된 상태입니다.
  • Inactive(Foreground)
    • App이 foreground 상태에 있지만 이벤트를 받지 않습니다.
    • Active 상태로 넘어가기 전에 잠시동안 이 상태에 있게 됩니다.
  • Active(Foreground)
    • App이 foreground 상태에 있고 이벤트를 받습니다.
    • Foreground 상태에 있는 app들은 평소 이 상태에 머물러 있습니다.
  • Background
    • App이 background 상태에서 다른 코드를 실행합니다.
    • Background 상태로 실행되는 app은 inactive 대신 background 상태로 진입합니다.
    • Suspended 상태로 넘어가기 전에 잠깐 머무르는 상태입니다.
    • Suspended 상태로 진입하기 전에 추가적인 코드 수행이 필요하면 좀 더 머무를 수도 있습니다.
  • Suspended
    • App이 background 상태에서 메모리에만 올라가 있고 코드를 실행하지 않습니다.
    • Background에서 추가적인 작업이 없다면 자동으로 suspended 상태로 진입합니다.
    • 다른 app을 실행하면서 메모리가 부족해지면 iOS system은 suspended 상태에 있는 app들을 별도의 알림 없이 종료시켜서 메모리를 확보합니다.

앱 생명주기

 

 

 

사실 저건 기본적인 생명 주기이고 우리가 실제로 사용해야 하는 코드는 밑에 있다. 

AppDelegate.swift 파일 안에서 대부분 이루어 질 것이며 때로는 notificaiton key 값을 통한 옵저빙을 통해서 ViewController 안에서도 제어할 수 있다. 

 

  • application(_:willFinishLaunchingWithOptions:)
    • App 실행을 위한 초기화가 완료되기 직전에 호출
    • 주로 App 실행 시 최초로 실행할 코드를 작성
  • application(_:didFinishLaunchingWithOptions:)
    • App이 실행되고 화면이 사용자에게 보여지기 직전에 호출
    • 주로 App 실행 후에 최종 초기화 코드를 작성
    • Not Running -> Foreground
    • 앱 기본 세팅 및 라이브러리 세팅
  • applicationDidBecomeActive(_:)
    • App이 Not Running 상태에서 Foreground(Inactive, Active) 상태로 진입할 때 호출
    • 주로 App이 실제로 사용되기 전에 마지막으로 준비할 수 있는 코드를 작성
  • applicationWillResignActive(_:)
    • App이 Foreground(Active) 상태에서 다른 상태로 진입할 때 호출
    • 주로 App이 quiescent(조용한) 상태로 변환될 때의 작업을 진행
  • applicationDidEnterBackground(_:)
    • App이 Background 상태에 진입했을 때 호출됩니다.
    • 특별한 처리가 없으면 Background 상태에서 Suspended 상태로 전환
    • App이 Suspended 상태로 진입하기 전에 중요한 데이터를 저장하거나 점유하고 있는 공유 자원을 해제하는 등 종료되기 전에 준비 작업을 진행
    • App이 종료된 이후 다시 실행될 때 직전 상태를 복구할 수 있는 정보를 저장
    • 서버 통신이나 DB에 데이터 통신 후 저장
  • applicationWillEnterForeground(_:)
    • App이 Background에서 Foreground로 돌아오기 직전 호출
    • Method가 호출된 뒤 Inactive 상태를 거쳐 Active 상태로 진입
    • 서버 통신으로 현재 화면 갱신
    • 서버 통신으로 앱 설정 갱신
    • version 체크로 강제 업데이트 여부 확인
    • 비밀번호 화면 띄워줌
  • applicationWillTerminate(_:)
    • App이 종료되기 직전에 호출됩니다. App이 곧 종료될 것임을 알려줍니다.
    • 다음 경우에는 호출되지 않습니다.
      1. 메모리 확보를 위해 Suspended 상태에 있는 app을 종료시킬 때
      2. 사용자가 multitasking UI를 통해 종료할 때
      3. 오류로 인해 app이 종료될 때
      4. Deivce를 재부팅할 때

 

일단 각 이벤트에 제가 설정하는 부분을 기억나는 대로 적어봤습니다. 

더 추가할게 있다면 추가 하겠습니다. 

 

 

 

참고

https://velog.io/@cskim/iOS-App-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Life-Cycle

 

[iOS] App 생명주기(Life Cycle)

Introduce - iOS는 각각의 app에 대해 실행부터 종료까지의 일련의 생명 주기를 관리합니다 Reference 1. 앱의 생명주기와 앱의 구조%EC%99%80%20%EC%95%B1%EC%9D%98%20%EA%B5%AC%EC%A1%B0(App%20Structure)/) 2. The App Life Cycle 3. iOS App Life C...

velog.io

 

 

 

댓글