본문으로 이동

Capgo에서 Live 업데이트 작동 방식

Capgo의 Live 업데이트 기술 구현에 대한 깊은 이해를 통해 iOS와 Android 모두의 하드웨어에서 작동하는 방식에 대해 이해합니다.

기사 기여

마틴 도나디유

Writer

Valeria

Reviewer

조던

Editor

Capgo

Capgo

Capacitor의 가장 강력한 기능 중 하나인 Capgo은 앱을 실시간으로 업데이트할 수 있게 해줍니다. 앱 스토어 제출 없이도 앱을 업데이트할 수 있습니다. Capgo이 이 기능을 구현하는 방식에 대해 자세히 알아보겠습니다.

기본 개념

Capacitor 앱은 두 개의 주요 층으로 구성됩니다.

  1. 웹 Layer네이티브 레이어
  2. __CAPGO_KEEP_0__: Android, iOS에서 code (Java/Kotlin for Android, Swift for iOS)

Capgo의 live update 시스템은 런타임에서 웹层을 교체하여 앱 바이너리에 컴파일되지 않은 파일을 교체합니다.

기술적 구현

Server Paths in Capacitor

Capgo는 두 가지 중요한 경로를 관리합니다.

  • 현재 서버 경로: 현재 WebView에 로드된 파일을 가리킵니다.
  • 다음 서버 경로: 다음 앱 리스타트 시 로드될 파일을 가리킵니다.

안드로이드 구현

안드로이드에서 Capgo는 경로를 다음과 같이 관리합니다.

// Store next server path
private void setNextCapacitorServerPath(String path) {
    SharedPreferences prefs = context.getSharedPreferences("CapWebViewSettings", Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("serverBasePath", path);
    editor.apply();
}

// Update current path and reload
private void setCurrentCapacitorServerPath(String path) {
    bridge.setServerBasePath(path);
    bridge.reload();
}

iOS 구현

iOS에서 경로를 관리하는 방법은 다음과 같습니다.

// Store next server path
private func setNextCapacitorServerPath(path: String) {
    KeyValueStore.standard["serverBasePath"] = path
}

// Update current path
private func setCurrentCapacitorServerPath(path: String) {
    bridge.viewController.setServerBasePath(path: path)
}

보안 조치

Capgo은 개발에서 배포까지 앱 업데이트가 완전히 안전하도록 end-to-end 암호화로 군사급 보안을 구현합니다. 우리의 암호화 시스템은 전통적인 code 서명보다 진정한 zero-knowledge 보안을 제공합니다.

End-to-End 암호화 아키텍처

  1. End-to-End 암호화 (E2EE): 업데이트 패키지를 개발 환경을 떠나기 전에 AES-256-GCM 암호화로 암호화합니다. 이 군사급 암호화는 업데이트가 전달되는 전체 프로세스 동안 앱 업데이트가 완전히 개인적이고 안전하도록 합니다.

  2. Zero-Knowledge 아키텍처: 다른 OTA 업데이트 솔루션은 업데이트만 서명하지만 Capgo은 진정한 zero-knowledge 암호화를 사용합니다. 이것은:

    • 업데이트 내용은 업로드하기 전에 암호화됩니다.
    • Capgo 서버는 암호화된 데이터만 저장합니다.
    • 업데이트 내용은 사용자 기기에서만 복호화됩니다.
    • 중간 매체가 업데이트 내용에 접근할 수 없습니다.
  3. 보안 키 관리:

    • 암호화 키는 CI/CD 환경에서 안전하게 생성 및 저장됩니다
    • 개인 키는 Capgo의 서버에 접근하지 않습니다
    • 각 앱 버전은 고유한 암호화 키를 사용할 수 있습니다
    • 키 회전을 지원하여 보안을 강화합니다

자세한 설명서에서 __CAPGO_KEEP_0__ Live Updates의 종단-to-종단 암호화에 대해 더 알아보세요 Live Updates에서 사용하는 Capgo의 끝에서 끝까지 암호화

업데이트 전 암호화

  1. 업데이트는 CI/CD pipeline에서 암호화됩니다:

    • 각 파일은 개별적으로 암호화됩니다
    • 메타데이터도 완전한 개인 정보를 위해 암호화됩니다
    • __CAPGO_KEEP_0__ Live Updates의 종단-to-종단 암호화에 대해 더 알아보세요
  2. 보안 저장소:

    • Capgo의 글로벌 CDN에 암호화된 패키지가 저장됩니다.
    • 서버에 평문 데이터가 절대 닿지 않습니다.
    • 서버가 해킹 당해도 데이터는 안전합니다.
  3. 보안 전달:

    • 업데이트는 암호화된 채널을 통해 전달됩니다.
    • 각 앱 인스턴스는 암호화의 무결성을 검증합니다.
    • 암호화 실패 시 자동으로 재시도 메커니즘
  4. 클라이언트 측 보안:

    • 업데이트는 설치 전에 검증됩니다.
    • 암호화 실패 시 자동 롤백
    • 앱의 보호된 저장소에 보안 키가 저장됩니다.

이 종합 보안 접근 방식은 앱 업데이트가 다음 공격에 안전하도록 보장합니다:

  • 중간자 공격
  • 서버 측 침해
  • 권한 없는 수정
  • 재생 공격
  • 콘텐츠 조작

업데이트 라이프 사이클

Capgo의 업데이트 프로세스는 기본적으로 자동화되었습니다. 자동화된 프로세스는 다음과 같이 작동합니다:

1. 자동 업데이트 확인

플러그인은 다음 상황에서 업데이트를 자동으로 확인합니다:

  • 앱 시작 시

이 동작은 autoUpdate 설정:

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true // Enable automatic updates
    }
  }
}

또는 수동으로 확인할 수 있습니다. getLatest()

2. 자동 다운로드

새로운 버전이 감지되면, autoUpdate 이 설정이 활성화되어 있는 경우:

  1. 자동으로 다운로드가 시작됩니다.
  2. 진행 상황은 내부적으로 추적됩니다.
  3. 다운로드 실패 시 앱 열기마다 재시도합니다.
  4. 다운로드 성공 시 앱 저장소에 저장됩니다.

이 프로세스를 모니터링하려면 이벤트를 참조하세요.

CapacitorUpdater.addListener('download', (info: DownloadEvent) => {
  console.log('Auto-download progress:', info.percent);
});

CapacitorUpdater.addListener('downloadComplete', (info: DownloadCompleteEvent) => {
  console.log('Auto-download complete:', info.bundle);
});

3. 자동 설치

설정에 따라 설치 타이밍이 달라집니다.

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true,
      "directUpdate": false // install update on app backgrounding
      "resetWhenUpdate": true, // reset live updates on native update (true by default)
      "autoDeleteFailed": true, // Auto cleanup failed updates (true by default)
      "autoDeletePrevious": true // Auto cleanup old versions (true by default)
    }
  }
}

설치가 발생하는 경우:

  • 즉시 설치가 발생하는 경우 directUpdate is true
  • 다음 앱 배경화면에서 설치가 발생하는 경우 directUpdate false
  • 설치 실패 시 자동 롤백

플러그인도 자동으로 저장소를 관리합니다:

  • 실패한 업데이트를 삭제하는 경우 autoDeleteFailed is true
  • 기존 버전을 삭제하는 경우 autoDeletePrevious is true

업데이트 지연

업데이트를 설치할 때 지연 조건을 사용하여 언제 설치할지 제어할 수 있습니다:

// Delay until app goes to background
await CapacitorUpdater.setDelay({
  kind: 'background'
});

// Delay until specific date
await CapacitorUpdater.setDelay({
  kind: 'date',
  value: '2024-03-20T10:00:00.000Z'
});

// Delay until next native version
await CapacitorUpdater.setDelay({
  kind: 'nativeVersion'
});

// Multiple conditions
await CapacitorUpdater.setMultiDelay({
  delayConditions: [
    {
      kind: 'background'
    },
    {
      kind: 'date',
      value: '2024-03-20T10:00:00.000Z'
    }
  ]
});

사용 가능한 지연 조건:

  • background: 앱이 백그라운드에 가면 설치
  • date: 특정 날짜/시간 이후에 설치
  • nativeVersion: 다음 네이티브 업데이트 이후에 설치
  • kill: 앱이 종료된 후에 설치

이것은 유용합니다:

  • 업데이트를 평일 시간대에 예약할 때
  • 업데이트와 사용자 활동을 동기화하는 방법
  • smooth한 업데이트 경험을 보장하는 방법
  • 중요한 작업 중에 중단되는 것을 방지하는 방법

업데이트 상태

자동 업데이트 프로세스 중에, 배ंडल은 이러한 상태를 거쳐갑니다:

  1. 다운로드 중: 다운로드 중입니다.
  2. 대기 중: 다운로드가 완료되었으며 설치를 기다리고 있습니다.
  3. 성공: 업데이트 설치 및 활성화 완료
  4. 오류: 업데이트 실패 (자동 롤백 트리거)

스토어 규정

애플 앱 스토어 ✅

Capacitor의 Live Update는 애플 앱 스토어 정책과 완전히 일치합니다. 애플 개발자 프로그램 라이선스 계약에서 다음과 같이 명시되어 있습니다:

“Interpreted code may be downloaded to an Application but only so long as such code: (a) does not change the primary purpose of the Application by providing features or functionality that are inconsistent with the intended and advertised purpose of the Application as submitted to the App Store, (b) does not create a store or storefront for other code or applications, and (c) does not bypass signing, sandbox, or other security features of the OS.”

Capgo 업데이트는 웹层만 수정하며 모든 플랫폼 보안 경계를 존중합니다.

구글 플레이 스토어 ✅

Live Update는 구글 플레이 정책을 준수합니다. 기기 및 네트워크 방지 정책에서 다음과 같이 명시되어 있습니다:

“이 제한은 code가 가상 머신 또는 인터프리터에서 실행되는 경우에만 적용됩니다. 가상 머신 또는 인터프리터가 Android API에 대한 간접 접근을 제공하는 경우.”

Capgo는 웹뷰 또는 브라우저에서만 작동하므로 이러한 허용된 지침에 따라 작동합니다.

최선의 방법

  1. 구성된 롤아웃: 점진적인 업데이트
  2. 버전 관리: 모든 배포된 버전 추적
  3. 롤백 지원: 문제 해결 속도 개선
  4. 델타 업데이트: 변경된 파일만 다운로드합니다

라이브 업데이트 사용 시기

라이브 업데이트 적합한 경우

  • 버그 수정
  • UI 개선
  • 콘텐츠 업데이트
  • 기능 토글

적용하지 않는 경우:

  • code의 원시 변경 사항
  • 메이저 버전 업데이트
  • __CAPGO_KEEP_0__의 원시 변경이 필요한 보안 패치

Capgo의 'Live Updates' 작동 방식에서 계속 진행하세요.

__CAPGO_KEEP_0__을 사용 중이라면 Capgo의 'Live Updates' 작동 방식 __CAPGO_KEEP_0__을 __CAPGO_KEEP_1__와 연결하여 Capgo 플러그인 디렉토리 Capgo 플러그인 디렉토리의 제품 워크플로우 Capacitor 플러그인들에 의해 Capgo Capacitor의 Live Update는 Capacitor 플러그인에 대한 구현 세부 정보에 의해 Capgo에 의해 구현됩니다. 플러그인 추가 또는 업데이트 Capacitor Live Update를 위한 implementation detail Ionic Enterprise 플러그인 대안 Ionic Enterprise 플러그인 대안의 product workflow Capgo 원본 네이티브 빌드 Capacitor 제품 워크플로우에서 Capgo 네이티브 빌드에 대한 업데이트를 위해.

Capacitor 앱의 Capacitor

Capacitor 앱의 Capgo를 사용하여 웹-layer 버그가 활성화된 경우, 앱 스토어 승인 대기 없이 바로修정합니다. 사용자는 배경에서 업데이트를 받으며 네이티브 변경 사항은 일반적인 검토 경로를 따릅니다.

Martin의 인간 지원

시작하기

최신 블로그

Capgo은 전문적인 모바일 앱을 만들기 위해 필요한 최고의洞察력을 제공합니다.