iOS App Extension Lifecycle 생명주기
이번 포스트에서는 iOS 플랫폼에서 제공하는 App Extension의 Lifecycle 생명주기와 Host App과 어떻게 Communication을 하는지 알아보도록 하겠습니다.
App Extension은 iOS 8.0에서 새로 나온 기능으로, Host App과는 별개의 Process로 동작하는 확장 Framework입니다. App Extension은 App이 아니며 App 간에 이루어지는 Inter Process Communication 역시 아닙니다.
실행 시에도 App과는 완전히 다른 독립된 프로세스(process)로 실행되기 때문에 완전히 다른 주소 공간(Isolated address space)를 가지게 됩니다. App Extension의 동작 방식을 간략하게 그림으로 살펴보도록 하겠습니다.
App Extension의 LifeCycle
App Extension은 앱이 아니기 때문에 수명주기와 환경이 다릅니다. 대부분의 경우 사용자가 앱의 UI 또는 presented activity view controller 에서 Extension을 선택하면 Extension 프로그램이 시작됩니다. 사용자가 Extension를 선택하기 위해 사용하는 앱을 Host App이라고 합니다. Host App은 확장에 제공되는 컨텍스트를 정의하고 사용자 작업에 대한 응답으로 요청을 보낼 때 Extension Lifecycle을 시작합니다. Extension은 일반적으로 Host App.에서 받은 요청을 완료 한 후 곧 종료됩니다.
예를 들어, 사용자가 macOS Host App에서 일부 텍스트를 선택하고 공유 버튼을 활성화 한 다음 공유 목록에서 추가 앱 정보를 선택하여 소셜 공유 웹 사이트에 텍스트를 게시하는 데 도움이 된다고 가정합니다. Host App은 선택한 텍스트가 포함 된 요청을 확장 프로그램에 발행하여 사용자의 선택에 응답합니다. 이 상황의 일반화 된 버전은 아래 그림의 1 단계에 나와 있습니다.
위 그림의 2 단계에서 시스템은 Host App의 요청에서 식별 된 추가 앱 정보를 인스턴스화하고 이들 사이에 통신 채널을 설정합니다. Extension은 Host App의 컨텍스트 내에서 View를 표시 한 다음 Host App의 요청에서 받은 데이터를 사용하여 작업을 수행합니다.
위 그림의 3 단계에서 사용자는 App Extension에서 작업을 수행하거나 취소합니다. 이 작업에 대한 응답으로 Extension은 사용자 작업을 즉시 수행하거나 필요한 경우 백그라운드 프로세스를 시작하여 Host App의 요청을 완료합니다. Host App은 Extension의 View를 해제하고 사용자는 Host App 내에서 이전 컨텍스트로 돌아갑니다. Extension의 작업이 완료되면 즉시 또는 나중에 결과가 Host App으로 반환 될 수 있습니다.
App Extension이 작업을 수행 한 직후 (또는 백그라운드 세션을 수행하여 백그라운드 세션을 시작한 직후) 4 단계에 표시된 것처럼 Extension이 종료됩니다.
App Extension의 통신 방법
App Extension은 주로 Host App과 통신하며 Transaction 처리를 연상시키는 방식으로 Host에서 요청하고 Extension에서 응답합니다. 아래 그림은 실행중인 Extension, Extension을 시작한 Host App 및 포함하는 앱 간의 관계를 간략하게 보여줍니다.
App Extensions와 포함하는 앱 간에 직접적인 통신이 없습니다. 일반적으로 포함 된 Extension이 실행되는 동안 Host App이 실행되지 않습니다. 앱과 호스트 앱이 포함 된 Extensions는 전혀 통신하지 않습니다.
일반적인 요청 / 응답 트랜잭션에서 시스템은 Host App 대신 App Extension을 열어 호스트가 제공 한 확장 컨텍스트로 데이터를 전달합니다. 확장은 사용자 인터페이스를 표시하고 일부 작업을 수행하며 확장의 목적에 적합한 경우 데이터를 호스트에 반환합니다.
위 그림의 점선은 App Extension과 Containing App간에 사용 가능한 제한된 상호 작용을 나타냅니다. Today 위젯 (및 다른 앱 확장 유형 없음)은 NSExtensionContext 클래스의 openURL : completionHandler : 메소드를 호출하여 시스템에 Containing App을 열도록 요청할 수 있습니다. 아래 그림의 읽기 / 쓰기 화살표로 표시되는 것처럼 모든 App Extensions 및 Containing App은 비공개로 정의 된 공유 컨테이너의 Shared Data에 액세스 할 수 있습니다. Extension, 해당 Host Application 및 Containing Application 간의 전체 통신 용어는 아래 그림에 간단한 형식으로 표시됩니다.
이번 포스트에서는 App Extension에 대해 간단하게 알아보았습니다.