앱을 개발하다 보면 앱의 생명주기에 따라 어떤 작업을 해야 할 때가 있다.
뭐 기본적으로 앱을 처음 실행시 기본적으로 라이브러리 세팅 등을 해준다. 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이 곧 종료될 것임을 알려줍니다.
- 다음 경우에는 호출되지 않습니다.
- 메모리 확보를 위해 Suspended 상태에 있는 app을 종료시킬 때
- 사용자가 multitasking UI를 통해 종료할 때
- 오류로 인해 app이 종료될 때
- Deivce를 재부팅할 때
일단 각 이벤트에 제가 설정하는 부분을 기억나는 대로 적어봤습니다.
더 추가할게 있다면 추가 하겠습니다.
참고
https://velog.io/@cskim/iOS-App-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0Life-Cycle
'개발 블로그 > 아이폰개발' 카테고리의 다른 글
[iOS GCD(Grand Central Dispatch)] 기본 2 단계 (0) | 2020.01.09 |
---|---|
[iOS GCD(Grand Central Dispatch)] 기본 1 단계 (0) | 2019.12.30 |
[iOS GCD(Grand Central Dispatch)] 소개 및 멀티스레드 프로그래밍 (0) | 2019.12.19 |
[iOS 앱 내 구입] iOS 앱 내 결제 시스템 구현편 (0) | 2019.12.13 |
[iOS 앱 내 구입] iOS 앱 내 결제 시스템을 구현하면서 필수 고려할 사항 정리 (2) | 2019.12.04 |
[iOS DateFormatter Locale] Date->String Locale identifier 사용표 (0) | 2019.11.21 |
[swift Date, DateFormatter] Date->String , String->Date 일때 locale(identifier), TimeZone(abbreviation) 관계 (0) | 2019.11.21 |
[Swift Date] 예약과 유저에게 보여줘야 할 DateFormatter TimeZone 설정 (0) | 2019.11.20 |
[Objectvie-c 의 블록] objectvie c 블록[block] 2장 메모리 영역 (0) | 2019.11.08 |
[Objectvie-c 의 블록] objectvie c 블록[block] 1장. (0) | 2019.11.08 |
댓글