본문 바로가기

공부/iOS

Preserving Your App's UI Across Launches

안녕하세요. brody입니다.

 

이번 포스팅은 Preserving Your App's UI Across Launches에 관련해서 정리해보려고 합니다.

 

이 포스팅은 iOS 13에서 deprecated된 내용을 포함하고 있습니다. 

iOS 13이상에서는 developer.apple.com/documentation/uikit/uiviewcontroller/restoring_your_app_s_state 문서를 참고하세요.
(나중에 포스팅하면 링크도 바꿀게요~)

 

그럼 바로 시작해볼게요

 

애플 원문 링크는 아래와 같습니다.

developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches

 


Preserving Your App's UI Across Launches(앱의 UI를 Launch에 걸쳐 보존합니다)

시스템이 종료한 후 앱을 이전 상태로 되돌립니다.

 

Overview

앱의 UI를 유지하면 앱이 항상 실행되고 있다는 착각을 유지하는데 도움이 됩니다.

 

iOS기기에서 자주 중단이 발생할 수 있으며, 장시간 중단하면 시스템이 사용자의 앱을 종료하여 리소스를 확보할 수 있습니다. 

 

그러나 사용자는 앱이 종료되었음을 알지 못하며 앱 상태가 변경될 것으로 예상하지 않습니다. 

 

대신 앱이 앱을 떠났을때와 동일한 상태에 있을 것으로 기대합니다. 

 

상태 보존 및 복원을 통해 앱이 다시 실행될 때 이전 상태로 돌아갈 수 있습니다. 

 

(어렵게만 생각했는데 앱을 사용하다 다른앱을 사용하거나 백그라운드로 보냈을때 시스템이 앱을 종료시켜도 실행중인 앱에 보이는 것을 말하고 있네요.)

 

적절한 시기에 UIKit은 앱의 view와 view controller의 상태를 디스크의 암호화된 파일에 보존합니다.

 

앱이 종료되었다가 다시 시작되면 UIKit은 보존된 데이터에서 view와 view controller를 재구성 합니다.

 

보존 및 복원 프로세스는 자동으로 시작되지만 이러한 프로세스를 지원하기 위한 몇가지 특정 작업도 수행해야 합니다.

 

  • 상태 보존 및 복원(state preservation and restoration)을 지원합니다.

  • 보존하려는 view controller에 복원 식별자(Assign restoration identifier)를 할당합니다.

  • 필요에 따라 복원시 view controller를 재생성합니다.

  • view Controller를 이전 상태로 복원하는데 필요한 사용자 지정 데이터를 인코딩하고 디코딩합니다.

인터페이스를 완전히 스토리보드로 정의하면 UIKit이 view controller를 재생성하는 방법을 알아서 자동으로 수행합니다.

 

스토리보드를 사용하지 않거나 view controller의 생성 및 초기화를 더 제어하려는 경우 직접 생성할 수 있습니다.

 

보존과 복원에 대한 예를 보려면 Restoring Your App’s State. 문서를 확인하세요.

 

 

 

Enable State Preservation and Restoration for Your App(앱의 상태 보존 및 복원 활성화)

app delegate의 applicatioapplication (_ : shouldSaveApplicationState :)application (_ : shouldRestoreApplicationState :) 메서드를 구현하여 상태 보존 및 복원을 선택합니다. (위의 2개의 메서드는 deprecated 된 상태입니다..)

 

두 메소드는 모두 연관된 프로세스가 발생해야하는지 여부를 나타내는 Bool값을 반환하며 대부분의 경우 단순히 true를 반환합니다.

 

그러나 앱의 인터페이스를 복원하는 것이 적절하지 않을 경우에는 false를 반환할 수 있습니다.

 

UIKit에서 applicatioapplication (_ : shouldSaveApplicationState :) 메소드를 호출할 때 true를 반환하는 것 외에도 데이터를 저장할 수 있습니다.

 

복원 프로세스 중 사용하려는 데이터를 저장할 수 있습니다.

 

예를 들어 아래의 Listing 1은 앱의 현재 version number를 저장하는 예를 보여줍니다.

 

복원 시 application (_ : shouldRestoreApplicationState :)메소드는 아카이브의 versionnumber를 확인하고 예상 버전과 일치하지 않는 경우 복원이 발생하지 않도록 합니다.

 

복원이 발생하지 않도록하는 경우에도 app delegate의 application(_:didFinishLaunchingWithOptions:)  메소드에서 수동으로 앱의 인터페이스를 구성할 수 있습니다.

 

 

Assign Restoration Identifiers to Your View Controllers (View Controller에 복원 식별자 할당)

UIKit에 복원 식별자를 할당하여 보존할 view controller를 명시적으로 알려줍니다.

 

복원 식별자는 프로그래밍 방식으로 또는 Interface builder에서 view controller에 할당하는 고유한 문자열입니다.

 

일반적으로 view controller 클래스의 이름은 적절한 복원 식별자이지만 모든 문자열을 사용할 수 있습니다.

 

스토리보드 파일의 view contoller의 해당 문자열을 추가하거나 런타임에 view controller의 restoreIdentifier 속성에 할당합니다.

 

 

보존 시 UIKit은 앱 windos의 root view controller를 보존하려고 합니다.

 

복원 식별자가 있는 각 root view controller 에 대해 UIKit은 해당 view controller에 사용자 지정 데이터를 아카이브에 인코딩하도록 요청합니다.

 

container view controller는 사용자 정의 데이터의 일부로 하위 view controller에 대한 참조를 인코딩 할 수 있습니다.

 

이경우, 해당 view controller에도 복원 식별자가 있는 경우 UIKit은 자식 view controller와 해당 콘텐츠를 보존합니다. 

 

이 프로세스는 모든 view controller가 저장되거나 무시 될 때까지 한 view controller에서 다음 view controller의 연결을 따라 반복적으로 계속됩니다.

 

모든 view controller의 복원 식별자를 할당할 필요는 없습니다.

 

실제로 일부 view controller는 보존하지 않을 수도 있습니다.

 

예를들어, 앱에 임시 로그인 화면이 표시되는 경우 해당 화면이 유지되는 것을 원하지 않을 수도 있습니다.

 

대신 복원시 표시 여부를 결정할 수 있습니다.

 

이 경우 로그인 화면의 view controller에 복원 식별자를 할당하지 않습니다.

 

보존에 대한 자세한 내용은 About the UI Preservation Process.를 참고하세요.

 

 

Encode and Decode Custom Information for Your App(앱에 대한 사용자 지정 정보 인코딩 및 디코딩)

보존 프로세스 중에 UIKit은 보존 된 각 VIew 및 view controller의 encodeRestorableState(with:) 메소드를 호출합니다.

 

이 메소드를 사용하여 view 또는 view controller를 현재 상태로 되돌리는데 필요한 정보를 유지합니다.

 

  • view 와 controls의 시각적 상태에 대한 세부 정보를 저장하세요.
  • 보존하려는 자식 view controller에 대한 참조를 저장하세요.
  • 사용자의 데이터에 영향을 주지 않고 삭제할 수 있는 정보를 저장하세요.

  • 앱의 영구 저장소에 이미 있는 데이터를 포함하지 마세요. 대신 나중에 해당 데이터를 찾을 수 있는 식별자를 포함하세요.

상태 보존은 앱의 데이터를 디스크에 저장하는 대신 사용할 수 없습니다.

 

UIKit은 임의로 상태 보존 데이터를 삭제할 수 있으므로 앱이 기본 상태로 돌아갈 수 있습니다.

 

보존 프로세스를 사용하여 현재 선택한 테이블 행과 같은 앱의 사용자 인터페이스의 상태에 대한 정보를 저장합니다. 

 

해당 테이블에 포함된 데이터를 저장하는데 사용하지 마세요.

 

아래의 Listing 2는 성과 이름을 수집하기 위한 텍스트 필드가 있는 view controller의 예를 보여줍니다.

 

텍스트 필드 중 하나에 저장되지 않은 값이 포함된 경우 메소드는 저장되지 않은 값과 텍스트 필드에 해당 값이 포함된 식별자를 저장합니다.

 

이 경우 저장되지 않은 값은 앱의 영구 데이터의 속하지 않으며, 필요한 경우 삭제할 수 있는 임시값입니다.

 

UIKit이 앱의 view, view controller, 상태 정보를 보존하는 방법에 대한 자세한 내용은 About the UI Preservation Process. 에서 확인하세요.

 

 

Create View Controllers When Asked(요청 시 View Controller 생성)

앱이 실행될 때 보존 상태 정보를 사용할 수 있는 경우 시스템은 보존된 데이터를 사용하여 앱의 인터페이스를 복원하려고 시도합니다.

  1. UIKit은 앱 델리게이트인 application(_:shouldRestoreApplicationState:) 메소드를 호출하여 복원을 진행하는지 결정합니다.
  2. UIKit은 앱의 스토리보드를 사용하여 view controller를 재생성합니다.

  3. UIKit은 상태 정보를 복원하기 위해 각 viewcontroller의 decodeRestorableState(with :)메소드를 호출하여 상태 정보를 복원합니다.

UIKit은 처음에 스토리보드에서 view controller와 view를 모두 로드합니다.

 

이러한 객체가 로드되고 초기화 한 후 UIKit은 상태 정봅를 복원하기 시작합니다.

 

decodeRestorableState(with:)  메소드를 사용하여 view controller를 이전 상태로 되돌립니다.

 

아래의 Listing 3 은 Listing 2에서 인코딩 된 상태를 디코딩하는 방법을 보여줍니다.

 

이 방법은 보존된 UserID에서 view controller의 데이터를 복원합니다.

 

텍스트필드를 편집중인 경우 이 메소드는 진행중인 값도 복원하고 해당 텍스트필드를 첫번째 응답자로 만들어 해당 텍스트필드에 키보드 커서를 표시합니다.

 

 

스토리보드에서 view controller를 정의하는 것은 상태 복원을 관리하는 가장 쉬운 방법이지만, 이 방법만이 유일한 방법은 아닙니다.

view controller를 재생성하는 다른 방법에 대한 자세한 내용은 About the UI Restoration Process. 를 참고하세요.

 


여기까지 입니다.

 

처음에는 제목도 이해가 안되고 문서도 길어서 겁이 났는데 막상 해보니까 어려운 내용은 아니였네요.

 

요약해보자면


앱이 백그라운드에 갔을때 리소스가 부족하면 시스템이 종료시킨다. 하지만 실행중인 앱 화면에는 남아있어서 사용자는 종료된줄 모른다.

 

종료된 앱을 사용자가 다시 켰을떄 종료하기 전의 모습으로 돌아갈 수 있는 방법을 제공한다.

텍스트필드가 수정중이였다면 수정중이던 텍스트필드가 포커스된 상태로 다시 앱을 시작할 수 있다.(이정도로 디테일하게)

 

이정도네요.

 

이런면에서는 애플의 디테일에서 놀랍네요. . 앱이 종료되었으면 그냥 처음부터 실행해! 가 아니라 종료된 상태로 만들어 줄게~니까요 ㅎㅎ

 

그럼 오늘은 여기까지 할게요

 

ㅅㄱㄹ!