콘텐츠로 건너뛰기

업데이트 동작

Capgo 앱의 업데이트를 배포할 때, 사용자가 최대한 빨리 업데이트를 받기를 원할 것입니다. 하지만 다운로드를 기다리거나 세션 중간에 앱을 재시작하도록 강요하여 사용자 경험을 방해하고 싶지는 않을 것입니다.

Capgo의 업데이트 동작은 빠른 업데이트 제공과 사용자 방해 최소화 사이의 균형을 맞추도록 설계되었습니다.

기본 업데이트 흐름

기본적으로 Capgo는 다음과 같이 앱 업데이트를 처리합니다:

  1. 앱 실행 시, Capgo 플러그인이 새 업데이트가 있는지 확인합니다

  2. 업데이트가 발견되면, 사용자가 현재 버전의 앱을 계속 사용하는 동안 백그라운드에서 다운로드됩니다

  3. 다운로드가 완료되면, Capgo는 사용자가 앱을 백그라운드로 보내거나 완전히 종료할 때까지 기다립니다

  4. 사용자가 다음에 앱을 실행하면, 업데이트된 버전이 실행됩니다

이 흐름은 사용자가 업데이트 프롬프트에 의해 중단되거나 다운로드를 기다릴 필요 없이 항상 앱의 최신 버전을 실행하도록 보장합니다.

이 접근 방식을 선택한 이유

백그라운드나 종료 이벤트에서 업데이트를 적용하는 것은 사용자 경험에 몇 가지 주요 이점이 있습니다:

  • 세션 중간에 업데이트 프롬프트로 인한 중단이나 다운로드 대기가 없습니다

  • 업데이트는 세션 사이에 원활하게 적용되므로, 앱 실행 경험이 항상 새롭습니다

  • 활성 사용자를 방해할 걱정 없이 자주 업데이트를 제공할 수 있습니다

주요 단점은 사용자가 앱을 백그라운드로 보내고 빠르게 재개할 경우, 업데이트가 그 사이에 적용되어 저장되지 않은 상태를 잃을 수 있다는 것입니다.

이를 완화하기 위해 다음을 권장합니다:

  • 상태를 자주 저장하고 앱이 재개될 때 원활하게 복원

  • 앱 상태의 큰 부분을 수정하는 매우 빈번한 업데이트 피하기

  • 중요한 흐름에 대해서는 업데이트 동작을 커스터마이징 고려(아래 참조)

업데이트 적용 시점 커스터마이징

경우에 따라 업데이트가 적용되는 정확한 시점을 더 세밀하게 제어하고 싶을 수 있습니다. 예를 들어, 사용자가 진행 중인 흐름을 완료하도록 보장하거나, 서버 측 변경과 앱 업데이트를 조정하고 싶을 수 있습니다.

Capgo는 업데이트가 설치되기 전에 충족되어야 하는 조건을 지정할 수 있는 setDelay 함수를 제공합니다:

import { CapacitorUpdater } from '@capgo/capacitor-updater';
await CapacitorUpdater.setMultiDelay({
delayConditions: [
{
kind: 'date',
value: '2023-06-01T00:00:00.000Z',
},
{
kind: 'background',
value: '60000',
},
],
});

이 예제는 2023년 6월 1일 이후 AND 앱이 60초 이상 백그라운드 상태가 된 후에 업데이트 설치를 지연시킵니다.

사용 가능한 지연 조건은 다음과 같습니다:

  • date: 특정 날짜/시간 이후에 업데이트 적용
  • background: 앱이 백그라운드로 전환된 후 최소 지속 시간 동안 대기
  • nativeVersion: 최소 버전의 네이티브 바이너리가 설치될 때까지 대기
  • kill: 다음 앱 종료 이벤트까지 대기

이러한 조건들을 조합하여 업데이트가 설치되는 시점을 정밀하게 제어할 수 있습니다.

즉시 업데이트 적용

중요한 업데이트나 매우 단순한 상태를 가진 앱의 경우, 백그라운드나 종료 이벤트를 기다리지 않고 다운로드 완료 즉시 업데이트를 적용하고 싶을 수 있습니다. Capgo는 directUpdate 구성 옵션을 통해 이를 지원합니다.

directUpdate는 JavaScript 코드가 아닌 capacitor.config.ts 파일에서 설정됩니다:

import { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
plugins: {
CapacitorUpdater: {
autoUpdate: true,
directUpdate: true,
},
},
keepUrlPathAfterReload: true,
};
export default config;

directUpdate가 활성화되면, Capgo는 사용자가 앱을 활발히 사용 중이더라도 다운로드가 완료되는 즉시 업데이트를 적용합니다.

directUpdate는 네이티브 구성이므로 JavaScript 코드에서 추가적인 처리가 필요합니다.

directUpdate를 사용할 때는 appReady 이벤트를 수신하고 이에 응답하여 앱의 스플래시 스크린을 숨겨야 합니다:

import { CapacitorUpdater } from '@capgo/capacitor-updater';
import { SplashScreen } from '@capacitor/splash-screen';
CapacitorUpdater.addListener('appReady', () => {
// 스플래시 스크린 숨기기
SplashScreen.hide();
});
CapacitorUpdater.notifyAppReady();

appReady 이벤트는 앱 초기화가 완료되고 대기 중인 업데이트가 적용된 후에 발생합니다. 이는 사용자가 최신 버전을 볼 수 있도록 보장하므로 앱의 UI를 표시하기에 안전한 시점입니다.

appReady 이벤트 처리 외에도, directUpdate를 사용할 때는 keepUrlPathAfterReload 구성 옵션을 true로 설정하는 것을 권장합니다. 이는 업데이트로 인한 앱 리로드 시 현재 URL 경로를 유지하여 앱에서 사용자의 위치를 유지하고 혼란을 줄이는 데 도움이 됩니다.

directUpdate를 사용할 때 appReady 이벤트를 처리하지 않고 keepUrlPathAfterReload를 설정하지 않으면, 사용자가 잠시 오래된 버전의 앱을 보거나, 초기 경로로 돌아가거나, 업데이트가 적용될 때 깜빡임을 볼 수 있습니다.

directUpdate 사용은 중요한 버그 수정이나 보안 패치를 제공하는 데 유용할 수 있지만, 몇 가지 트레이드오프가 있습니다:

  • appReady 이벤트를 적절히 처리하지 않으면 업데이트가 적용될 때 사용자가 깜빡임이나 로딩 상태를 볼 수 있습니다
  • 업데이트가 앱 상태나 UI를 수정하는 경우, 사용자는 세션 중간에 방해가 되는 변경을 볼 수 있습니다
  • keepUrlPathAfterReload가 설정되지 않은 경우 앱에서 사용자의 위치가 손실되어 혼란을 줄 수 있습니다
  • 원활한 전환을 보장하기 위해 상태 저장 및 복원을 신중하게 처리해야 합니다

directUpdate를 활성화하는 경우 다음을 권장합니다:

  • appReady 이벤트를 처리하여 앱의 UI가 표시되는 시점을 제어
  • keepUrlPathAfterReloadtrue로 설정하여 앱에서 사용자의 위치 유지
  • 사용자 진행 상태를 잃지 않도록 필요에 따라 앱 상태 저장 및 복원
  • 갑작스러운 전환, 상태 손실 또는 혼란스러운 위치 변경이 없도록 앱의 업데이트 동작을 철저히 테스트

대부분의 경우 기본 업데이트 동작이 빠른 업데이트 제공과 방해 최소화 사이의 최상의 균형을 제공합니다. 하지만 특정 요구 사항이 있는 앱의 경우, Capgo는 업데이트가 적용되는 시기와 방법을 커스터마이징할 수 있는 유연성을 제공합니다.