메인 콘텐츠로 건너뛰기

효과적인 앱 업데이트 알림 전략

Capacitor & Electron 에 대한 강력한 앱 업데이트 알림을 implement 하세요. UX 패턴, Capgo, silent/forced updates, CI/CD 전략을 학습하세요.

마틴 도나디유

마틴 도나디유

콘텐츠 마케터

효과적인 앱 업데이트 알림 전략

__CAPGO_KEEP_1__를 implement 한 후, 금요일에 hotfix를 배포했다. 월요일에, 지원팀은 여전히 사용자들로부터 업데이트를 받지 못한 사용자들로부터 지원을 받고 있고, 베타 테스터들은 오래된 버전으로 고착되어 있고, 한 기업 고객은 정확히 자신의 field 팀이 실행 중인 버전을 알고 싶어한다. 그 순간, 알림이 필요해진다. app update notification 이것은 모달이 아닙니다. 릴리스 제어를 위한 운영 체제입니다.

Electron 프로젝트와 Capacitor에서 업데이트가 존재하는지 감지하는 것이 어려운 것은 아닙니다. 업데이트가 존재하는지 감지하는 것 외에 업데이트를 누구에게, 언제 보여주고, 업데이트를 무시할 경우 어떻게 처리할 것인지, CI/CD에서 업데이트가 어떻게 이동할 것인지, 롤아웃 후에 어떤 데이터가 제공되는지에 대한 모든 것이 어려울 수 있습니다. 업데이트를 UI의 꾸밈으로만 생각하면 노이즈가 많은 업데이트를 보내고, 릴리스 로직이 약하고 사용자가 혼란스러울 수 있습니다. 업데이트를 제품의 생명 주기 일부로 생각하면 더 안전한 롤아웃과 더 평온한 지원 큐를 얻을 수 있습니다.

목차

앱 업데이트 전략이 중요한 이유

업데이트는 유지보수에만 영향을 주지 않습니다. 사용자 유지율에도 영향을 줍니다.

업데이트는 단순히 버그를 고치고 사용자에게 알리고 다음 단계로 넘어가기만 하면 된다고 생각하는 팀이 많습니다. 하지만 제품의 영향력을 놓치고 있습니다.

설치 후 앱으로 돌아오게 할 수 있는 앱의 생명주기 채널 중 하나인 푸시 알림은 데이터를 요약한 Invesp의 모바일 푸시 알림 연구 푸시 알림이 앱 참여도를 88%까지증가시킬 수 있으며 옵인한 사용자는 사용자가 업데이트를 받지 못하는 비율입니다. 업데이트 전략에서 중요합니다. 왜냐하면 모든陈舊한 클라이언트는 업데이트, 수정, 또는 준수 변경 사항을 배포한 후에 사용자가 업데이트를 받지 못하는 사용자입니다.

약한 업데이트 흐름은 동시에 세 가지 문제를 만듭니다:

  • 제품 지연 새로운 기능이 불균형하게 출시되기 때문에 PM은 분석에서 혼합된 신호를 읽습니다.
  • 지원 지연 agent가 스크린샷, 버전, 장치 세부 정보를 요청해야 하기 때문에 문제를 재현하기 전에.
  • 보안 취약성 기존 클라이언트가 이미 이동한 API와 계속 대화할 때 발생합니다.

실용적인 규칙: 업데이트 전달을 릴리스 관리의 일부로 다루세요. 스프린트의 끝에서 예의 차원에서 업데이트를 보내는 것은 아닙니다.

스토어 업데이트와 라이브 업데이트는 서로 다른 문제를 해결합니다.

앱 스토어와 플레이 스토어 업데이트는 여전히 중요합니다. 네이티브 의존성 변경, 정책에 의한 릴리스, 권한 변경, 바이너리 수준 수정은 여기에 속합니다. 그러나 스토어에 의한 업데이트는 시스템의 한 층이고, 검토와 사용자 수용이 직접 제어할 수 없는 이유로 느립니다.

For Capacitor와 Electron 앱의 경우, 실시간 업데이트에는 다른 작업 범위가 포함됩니다. 이들은 JavaScript, CSS, 복사본, 자산 및 기능 플래그와 같은 웹 번들 변경에 적합합니다. 이들은 새로운 바이너리가 필요하지 않습니다. 실제로, 이는 두 개의 릴리스 질문을 분리하는 것을 의미합니다.

릴리스 질문 어떤 변경이 새로운 네이티브 바이너리가 필요하나요?
스토어 릴리스 이 변경이 웹 번들로 안전하게 전달될 수 있나요?
실시간 업데이트 사용자가 계속하기 전에 알 필요가 있나요?
인앱 알림 결정 일부 사용자에게 지금 필요하나요?
채널 기반 롤아웃 이 분리는 클라이언트 앱을 개발하는 대행사들이 단일 '업데이트가 준비되었습니다' 팝업을 설계하는 것을 중단해야 한다는 이유입니다. 전문 팀은柔한 지시, 무음 적용 경로, 롤백 규칙, 채널 대상 설정 및 후속 검사가 가능하도록 로그를 지원해야 합니다.

__CAPGO_KEEP_0__

The trust angle matters too. 사용자는 업데이트가 거의 그만큼의 불확실한 중단을 싫어한다. 앱이MOOTH하게 업데이트되며 주요 변경 사항을 명확하게 설명하고 실제로 중단되거나 보안 위협이 될 경우에만 사용을 차단하면, 이는 전문성을 읽힌다.

Capgo를 구현하는 업데이트 감지

첫 번째 작업은 간단하다: 사용자가 실행 중인 버전을 알리고, 사용자가 속한 채널을 알리고, 업데이트가 필요한지 결정하는 것이다. 대부분의 DIY 업데이트 시스템은 이러한 결정이 섞여서 복잡해진다. 그들을 분리하라.

https://capgo.app/blog/building-a-native-mobile-app-with-nextjs-and-capacitor/에서 스크린샷

버전 인식으로 시작하라

신뢰할 수 있는 업데이터는 런타임 시에 다음 세 가지 값을 사용할 수 있어야 한다.

  1. 설치된 앱 버전
  2. assign된 릴리스 채널
  3. 현재 업데이트 상태예를 들어, idle, checking, available, downloading, ready, failed와 같은 상태 모델을 생략하면,通知 버그가 빠르게 나타난다. 앱이 너무 자주 체크한다. 동일한 알림이 매번 실행될 때 나타난다. 배경 다운로드가 완료되었지만 UI는 여전히 “체크 중”이라고 나타난다.

관리 서비스는 일반적으로 이러한 이유로 올바른 선택이다: __CAPGO_KEEP_0__ Snippet가 제안하는 것보다 운영 작업이 더 무거운다. 서명된 패키지, 채널 규칙, 롤백 지원, 버전 기록, 장치 수준 로그 및 배포 인프라가 필요하다.

A managed service is usually the right call here for one reason: the operational work is heavier than the code snippet suggests. You need signed bundles, channel rules, rollback support, version history, device-level logs, and delivery infrastructure. Capgo Capacitor와 Electron 앱을 위한 업데이터 플러그인과 호스팅된 배포 워크플로우를 제공합니다. 따라서 대부분의 클라이언트 팀은 내부적으로 스택을 재구축하는 것보다 사용하는 것이 더 좋습니다.

업데이터를 앱 시작 시에 연결합니다.

앱이 시작될 때, 셸이 준비되면 가벼운 체크를 실행하세요. 업데이트가 필요하지 않으면 첫 번째 페인트를 차단하지 마세요.

Capacitor 앱의 일반적인 패턴은 다음과 같습니다.

import { App } from '@capacitor/app'
// import your updater SDK here

type UpdateDecision =
  | { kind: 'none' }
  | { kind: 'soft'; version: string }
  | { kind: 'hard'; version: string }
  | { kind: 'silent'; version: string }

async function checkForUpdate(): Promise<UpdateDecision> {
  try {
    // Replace with your updater SDK call
    const result = await updater.check()

    if (!result || !result.available) {
      return { kind: 'none' }
    }

    if (result.metadata?.mandatory === true) {
      return { kind: 'hard', version: result.version }
    }

    if (result.metadata?.silent === true) {
      return { kind: 'silent', version: result.version }
    }

    return { kind: 'soft', version: result.version }
  } catch {
    return { kind: 'none' }
  }
}

App.addListener('appStateChange', async ({ isActive }) => {
  if (!isActive) return
  const decision = await checkForUpdate()
  handleUpdateDecision(decision)
})

__CAPGO_KEEP_0__의 목적은 "새로운 것이 있는가?"가 아니라 "__CAPGO_KEEP_1__의 새로운 것이 있는가?" "__CAPGO_KEEP_2__의 사용자가 __CAPGO_KEEP_3__ 채널에서 __CAPGO_KEEP_4__의 새로운 것을 사용할 수 있는가?" 그리고 앱이 그에 어떻게 반응해야 하는가?"입니다. check() 건전한 구현에서는 마지막 성공적인 체크 시간과 마지막으로提示된 버전을 저장합니다. 그럼 앱 업데이트通知 로직이 idempotent 하게 유지되며, 사용자에게 지속적으로 알람을 보내는 대신 naggy 하지 않습니다. __CAPGO_KEEP_1__ __CAPGO_KEEP_2__ __CAPGO_KEEP_3__ __CAPGO_KEEP_4__

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__

__CAPGO_KEEP_0__를 읽고 branch를 일찍 확인하세요.

__CAPGO_KEEP_0__는 가능한 한 체크 결과와 가까운 곳에서 발생해야 합니다. 스크린을 가로지르지 말고 업데이트 규칙을 퍼뜨리지 마세요.

  • __CAPGO_KEEP_1__ __CAPGO_KEEP_1__는 아무것도 하지 말고 일반적인 체크 결과를 로깅합니다.
  • __CAPGO_KEEP_2__ __CAPGO_KEEP_2__는 배너, 설정 배지, 또는 가벼운 인앱 알림을 큐합니다.
  • __CAPGO_KEEP_3__ __CAPGO_KEEP_3__는 배경에서 다운로드하고 다음 런치 시 활성화합니다.
  • __CAPGO_KEEP_4__ __CAPGO_KEEP_4__는 앱을 제어된 블록킹 플로우로 전환합니다.

__CAPGO_KEEP_5__에서 이 결정은 나중에 React, Vue, 또는 Ionic UI가 일관되게 소비할 수 있도록 중앙 저장소에서 노출하는 것을 좋아합니다.

이 walkthrough는 Capacitor 앱의 더 넓은 설정을 보는 데 유용합니다:

감지层은 단순하게 유지하세요. rollout 정책에서 재미를 찾으세요, code의 시작에서 아닙니다.

효과적인 알림 패턴 설계

업데이트 알림이 실패하는 이유는 대부분 팀이 하나의 패턴을 선택하고 모든 것에 사용했기 때문입니다. 그 결과, 복사 수정에 대한 차단 모달을 보여주거나 nobody가 주목하지 못하는 중요한 마이그레이션을 토스트 뒤에 숨기게 됩니다.

환경은 이미 꽉 차 있습니다. Business of Apps의 Airship 벤치마크 요약 46개의 푸시 알림을 일일이 받는 미국 스마트폰 사용자의 평균 수를 iOS에서는 3.4%의 반응률과 클릭-통과율이 조용한 4.6%의 Androidreports __CAPGO_KEEP_0__ __CAPGO_KEEP_0__ __CAPGO_KEEP_0__. 사용자에게 지속적인 방해를 피하면서 주목을 끌 수 있는 앱 업데이트 알림이 있어야 합니다.

3 가지 효과적인 모바일 앱 업데이트 알림 패턴을 보여주는 정보그래픽: 배너, 모달 다이얼로그, 앱 내 메시지.

사용자에게 최소한의 방해를 주면서도 작동하는 패턴을 사용하세요.

좋은 업데이트 UI는 방해의 비용을 존중합니다. 사용자가 결제 정보를 입력 중이거나, 환자 기록을 입력하거나, 재고를 스캔하는 중이라면, 모달은 고쳐야 할 버그보다 나쁠 수 있습니다.

나는 이런 패턴을 매핑하는 경우가 많습니다:

  • 상단 또는 하단 배너 소규모 수정, 낮은 긴급성 개선, 무음 업데이트 확인에 사용합니다.
  • 토스트 배경 상태, 예를 들어 “다음 런칭 시 업데이트 준비됨”, 하지만 중요하지 않은 결정에 사용하지 않습니다.
  • 설정 또는 프로필 진입점 사용자가 제어와 변경 로그 시각화를 원하는 경우에 사용합니다.
  • 차단 모달 새로운 버전이 설치되지 않은 경우에만 사용할 수 있습니다.

슬기로운 배너는 종종 드라마틱한 모달보다 더 많은 일을 합니다. 왜냐하면 사용자가 인터페이스를 싸우지 않도록 강제하지 않기 때문입니다.

주요 패턴 간의 빠른 비교

패턴 좋은 점 주된 위험 구현 참고
배너 선택적 업데이트, 낮은 긴급성의 유도 쉽게 무시할 수 있습니다. 버전당 무시할 수 있는 선택
토스트 __CAPGO_KEEP_0__ 상태 변경 __CAPGO_KEEP_0__이 너무 빠르게 사라진다 __CAPGO_KEEP_0__와 지속 가능한 설정 항목 pair
앱 내 메시지 상황에 맞는 기능 출시 __CAPGO_KEEP_0__이 빨리 보이지 않을 수 있다 __CAPGO_KEEP_0__과 관련된 화면에 연결
모달 필수 동작 사용자 불만 어려운 게이트에만 예약

__CAPGO_KEEP_0__ 구현 세부 사항 state persistence Later 버튼을 클릭하면 사용자가 제안된 버전을 저장합니다. 사용자가 배너를 닫으면 모든 경로 변경 시 다시 표시하지 않습니다. 이 기능을 기억하지 않으면 업데이터가 작동하더라도 앱이 깨진 것처럼 사용자에게 보입니다.

이미 푸시를 라이프 사이클 스택의 일부로 사용 중인 팀에게는 앱 업데이트 UX를 broader messaging 설정과 비교하는 것이 가치가 있습니다. Capgo’s guide to 아이오닉과 Capacitor 푸시 알림과 Firebase 운송 문제를 앱 내부 표면에서 사용자에게 행동을 요청하는 것과 분리하는 데 도움이 되는 것이 중요합니다.

업데이트는 단순히 푸시만으로 이루어지지 않습니다.

OS-level 업데이트 배지와 스토어 알림만으로는 충분하지 않습니다. 사용자가 알림을 놓치게 되는 이유는 장치 설정, 배지 권한, 자동 업데이트 동작, 또는 전원 절약 모드 때문입니다. 따라서 스토어 생태계가 올바르게 작동하는 경우에도 앱 내부 메시징이 중요합니다.

이것은 특히 Electron의 경우 더 명확합니다. 데스크톱 사용자는 workflow 중간에 시스템 대화가 포커스를 빼앗는 대신에 불쾌하지 않은 상태 지시기를 기대합니다. shell 내에 작은 ‘업데이트 준비’ 칩이 시스템 대화보다 더 전문적입니다.

업데이트의 위험과 사용자의 현재 작업에 맞는 패턴이 가장 좋습니다. 그 외의 모든 것은 연극입니다.

업데이트 흐름 자동화 및 사용자 선택

감지 및 UX 패턴이 구축된 후, 워크플로우가 핵심 시스템입니다. 이 내에서 팀은 종종 과잉 자동화로 제어를 잃거나, 지원 부채를 만들 수 있습니다.

자동 업데이트워크 플로우의 세 가지 유형을 나타내는 다이어그램: silent, user-choice, 및 forced updates.

Coderio의 앱 유지 관리 지침 추천하는 실제 릴리스 리듬은 2주에서 4주 간격으로 작은 업데이트를 그리고 3개월에서 6개월 간격으로 주요 릴리스를, 중요한 보안 또는 안정성 문제에 대해 하드 업데이트를 예약합니다. 그것은 올바른 정신 모델입니다. 릴리스 유형에 따라 결정해야 합니다. 개발자들의 두려움에 따라 결정하지 마세요.위험도가 낮은 변경 사항에 대한 silent 업데이트

silent 업데이트는 __CAPGO_KEEP_0__ 앱에서 가장 미사용된 경로입니다. 스타일링, 복사본, 기능 플래그 연결, 또는 중단되지 않는 자바 스크립트 버그를 수정한 경우 일반적으로 사용자에게 중단하지 않아도 됩니다.

Silent updates are the most underused path in Capacitor apps. If you fixed styling, copy, feature-flag wiring, or a non-breaking JavaScript bug, there’s usually no reason to interrupt the user at all.

silent 업데이트는 __CAPGO_KEEP_0__ 앱에서 가장 미사용된 경로입니다. 스타일링, 복사본, 기능 플래그 연결, 또는 중단되지 않는 자바 스크립트 버그를 수정한 경우 일반적으로 사용자에게 중단하지 않아도 됩니다.

  1. 앱이 새로운 번들을 확인합니다.
  2. 업데이트가 배경 적용에 안전하다고 표시된 경우, 배경에서 다운로드가 시작됩니다.
  3. 앱은 다음 로그인 시 새로운 번들을 활성화합니다.
  4. 재시작 후 사용자가 성공적으로 업데이트된 메시지를 잠시 보거나 아무것도 보지 않을 수 있습니다.

마지막 선택은 변경에 따라 달라집니다. 만약 업데이트가 가시적인 워크플로를 변경했다면, 다음 로그인 시 작은 “새로운 기능” 카드를 통해 사용자가 방향을 찾을 수 있습니다. 만약 그렇지 않았다면, 침묵이 괜찮습니다.

단순한 상태 핸들러는 다음과 같이 생길 수 있습니다:

async function handleUpdateDecision(decision: UpdateDecision) {
  if (decision.kind === 'silent') {
    await updater.download()
    await updater.setNextBundle()
    localStorage.setItem('pendingUpdateVersion', decision.version)
    return
  }

  if (decision.kind === 'soft') {
    showBanner(decision.version)
    return
  }

  if (decision.kind === 'hard') {
    showForcedUpdateScreen(decision.version)
  }
}

가시적인 제품 변경에 대한 사용자 선택 흐름

사용자 선택 흐름은 업데이트가 충분히 사용자가 인터럽션에 동의해야 하는 충분한 동작을 변경할 때 적합합니다. 새로운 네비게이션, 개정된 온보딩, 변경된 승인 흐름, 또는 대규모 데스크톱 리디자인 모두 이 그룹에 속합니다.

prompt는 좁아야 합니다:

  • 무엇이 변경되었나요?
  • 왜 그것이 중요합니까?
  • 그들이 지금 업데이트를 하면 무슨 일이 일어날까요?
  • What happens if they wait

Don’t write release-note poetry into the dialog. One clear sentence and two buttons usually outperform a wall of copy.

I like this pattern:

새로운 버전이 사용 가능합니다. 업데이트된 보고서 workflow와 export 문제를 해결하는 업데이트가 포함되어 있습니다. 업데이트 하거나 나중에 설치할 수 있습니다.

“나중에”를 신중하게 사용하세요. 이전 클라이언트가 유효한 경우 사용자에게 계속할 수 있도록 하세요. 이전 클라이언트가 API 마이그레이션으로 인해 깨질 경우 옵션처럼 보이지 마세요.

애플리케이션 배포 이외의 조직 관리에 관심 있는 팀에게도 동일한 논리가 나타납니다. 좋은 자동화는 정기적인 변경을 조용히 처리하고 위험한 경우에만 중단합니다. 그 이유로 SOC 팀을 위한 보안 자동화 개요 는 유용합니다. 이벤트를 분류하고 안전한 경로를 자동화하고 인간의 중단을 의도적으로 하여 보안 자동화의 더 넓은 설계 원칙을 보여줍니다.

또한 사용자 로직을 강화할 수 있습니다. Capgo의 앱 업데이트에 대한 사용 빈도 세분화 는 실용적인 참고 자료입니다. 빈번한 사용자와 간헐적인 사용자는 항상 동일한 타이밍이나 프롬프트 스타일을 받을 필요는 없습니다.

좁은 крит적 사례에 대한 강제 업데이트

강제 업데이트 는 합법적입니다. 하지만 그들은 또한 남용하기 쉽습니다.

하드 게이트를 사용할 때 다음 중 하나가 참일 때:

조건 강제 업데이트
알려진 취약점이 있는 보안 패치
중요한 안정성 문제로 인한 심각한 손상
백엔드 계약을 깨는 경우
미소한 UI 개선 아니요
선택적 기능 출시 아니요

implementation은 명시적이어야 합니다. 앱이 시작될 때 설치된 버전을 확인하고, 지원하는 최소 버전과 비교하여, 사용자가 그 아래에 있는 경우에만 사용자를 차단 상태로 만듭니다. "필수"를 "새 버전이 존재한다"에서 추론하지 마세요.

강제 업데이트 화면은 세 가지 속성을 필요로 합니다:

  • 사용자가 막히지 않도록 하기. 사용자에게 다시 시도할 수 있는 명확한 경로를 제공하세요.
  • 명확한 설명. 사용자에게 업데이트 이유를 설명하세요.
  • 오프라인 처리. 네트워크가 사용할 수 없을 때도 설명하세요.

이러한 방식은 모바일 데이터가 불안정할 때 modal에 하나의 "업데이트" 버튼만 있는 것이 작동하지 않습니다. 앱이 차단된 경우, 복구 경로가 일반 경로보다 더 정교해야 합니다.

채널 및 테스트 메트릭을 사용한 고급 출시

업데이트 사고가 대부분 발생하지 않은 이유는 감지 실패 때문이 아니라, 업데이트가 실제로 작동하는 것을 먼저 확인하지 못했기 때문입니다.

채널은 폭파 반경을 줄입니다.

채널 기반의 롤아웃은 클라이언트 앱에서 실시간 업데이트를 안전하게 배포하는 가장 안전한 방법입니다. 단일 배포본을 모든 사용자에게 배포하는 대신, 내부, QA, 베타, 스테이징, 프로덕션, 또는 고객별 스트림과 같은 대상으로 배포합니다.

이것은 운영 제어보다 바이너리 런칭보다 더 많은 제어력을 제공하는 배포 형태를 만듭니다. 하나의 빌드는 각 대상이 다음 그룹이 업데이트를 볼 때까지 신뢰를 제공하는 대상의 순서를 따라갑니다.

업데이트 워크플로우와 관련된 계획 구조를 포함한 상업용 롤아웃 모델의 유용한 스크린샷은 아래에 있습니다.

스크린샷은 https://capgo.app/pricing 에서 가져옵니다.

이것은 알림 전략에도 중요합니다. Adapty의 푸시 알림 최적화 가이드 보고서에 따르면 최적화된 전송 시간은 반응률을 40%까지 증가시킬 수 있습니다. 고급 타겟팅은 반응률을 3배까지 증가시킬 수 있습니다. __CAPGO_KEEP_0__.. 업데이트 시스템에서, 그것은 채널에 의존하는 롤아웃과 버전별 메시징, 전체 설치 기반에 대한 단일 경고를 보내는 것이 아니라.

추적 데이터는 사용자가 실제로 이동했는지 여부를 알려줍니다.

전문적인 업데이트 시스템은 엔지니어링이 ad hoc 로그를 뒤지지 않고 이러한 질문에 답해야 합니다:

  • 각 기기의 버전은 무엇입니까?
  • 업데이트가 다운로드되었습니다.
  • 다음 런칭 시에 성공적으로 적용되었습니다.
  • 롤아웃 후 시작 오류가 증가했습니다.
  • deprecated 버전에 갇힌 사용자는 누구입니까?

추적 데이터가 없이는, 지원 팀은 제품 문제로 오해하지만 실제로는 롤아웃 문제로 오해할 것입니다.

업데이트 상태를 볼 수 없다면, 지원 팀은 제품 문제로 오해하지만 실제로는 롤아웃 문제로 오해할 것입니다.

나는 단일 기기별 타임라인을 aggregate-only 대시보드보다 선호합니다. Aggregate 채택 곡선은 유용하지만, 특정 기업 고객이 한 주 후에도 앱을 이전 버전으로 열 수 있는 이유를 설명하지 못합니다.

기기별 로그는 이러한 이유를 설명할 수 있습니다. 버전별 배포도 더 실용적이게 됩니다. 특정 계층을 분리할 수 있기 때문입니다. 이 안내서에 대해 특정 버전을 사용자에게 전송하는 것 여러 고객 환경을 지원하는 경우 일반적으로 엔터프라이즈 팀이 필요한 제어의 한 예입니다.

CI/CD는 빌드만 하는 것이 아니라, 배포하고 관찰해야 합니다.

현대적인 PIPELINE은 '빌드 성공'에 그치지 말아야 합니다. 그것은:

  1. 빌드 배ंडल
  2. 올바른 채널에 서명하고 배포
  3. 릴리즈 메타데이터 첨부
  4. 수용과 실패를 모니터링
  5. 건강이 악화되면 롤백

롤백은 데모 업데이터와 프로덕션 업데이터의 차이입니다. 배ंडल이 런치 충돌이나 시작 중단을 일으키면 팀은 빠르게 폭파 반경을 막아야 합니다. 그것이 가장 큰 이유 중 하나입니다. 배달, 경계, 관찰성, 롤백은 부가 기능이 아닙니다. 그것들은 시스템입니다.

CI/CD 통합 자체가 복잡하지 않아도 됩니다. 중요한 것은 배포가 결정적이고 추적 가능해야 합니다. 릴리즈는 커밋, 환경, 액터, 채널에 의해 attributable해야 합니다. 만약에 그 네 가지 질문에 빠르게 대답할 수 없다면, 사고 대응이 난해해집니다.

통지 문제를 해결하는 일반적인 방법

다음 문제는 Capacitor 및 Electron 업데이트 작업에서 반복적으로 나타납니다. 대부분의 문제는 상태漂移에서 오는 것이 아니라 네트워크에서 오는 것입니다.

프롬프트는 매번 시작할 때마다 나타납니다.

증상: 사용자는 앱 업데이트 알림을 무시하지만 앱이 열릴 때마다 다시 나타납니다.

가능한 원인: 성공적으로 확인하고 있지만, 제공된 버전에 따라 프롬프트 상태를 영구적으로 저장하지 않습니다.

수정: 사용자가 무시하거나 미루었던 버전을 저장하고, 다시 UI를 표시하기 전에 비교하십시오.

function shouldPrompt(version: string): boolean {
  const dismissed = localStorage.getItem('dismissedUpdateVersion')
  return dismissed !== version
}

function dismissPrompt(version: string) {
  localStorage.setItem('dismissedUpdateVersion', version)
}

이것은 또한 팀이 “사용 가능”과 “중단해야 할”을 혼동하는 곳입니다. 이들은 다른 결정입니다.

무음 업데이트 다운로드하지만 nunca 활성화됩니다.

증상: 로그에 표시된 바에 따르면 패키지가 다운로드되었지만 이전 UI가 계속 로드됩니다.

가능한 원인: 앱이 업데이트 다운로드를 완료했지만 다음 실행 시 마크하지 않았거나, 마지막 활성화된 번들을 참조하는 시작 경로가 있습니다.

수정: code와 분석에서 "다운로드"와 "활성"을 별도의 상태로 모델링하고, 활성화를 명시적으로하고 부트 시 확인하세요.

생명주기 모델을 하나의 불리언 대신에 "다운로드"와 "활성"으로 모델링하면 많은 버그가 사라집니다. available -> downloading -> ready -> active 체크는 개발자 모드와 프로덕션 모드에서 다르게 동작합니다.

증상:

릴리스 빌드에서 업데이트 감지가 작동하지만 로컬 개발 환경에서 작동하지 않거나, 그 반대 경우. 가능한 원인:

환경에 따라서 구성이 다릅니다. 개발자 모드에서 채널 이름이 다르거나, 플러그인이 비활성화되거나, 시작 __CAPGO_KEEP_0__가 올바른 보호자로 wrapping되지 않았습니다. environment-specific configuration. Different channel names, disabled plugins in debug, or startup code wrapped in the wrong guard.

Fix: make activation explicit and verify it during boot. Treat “downloaded” and “active” as separate states in __CAPGO_KEEP_0__ and analytics. 환경 동작을 보이게 하세요. 로그 채널, 앱 버전, 및 빌드 모드를 시작 시 표시하세요. 메모리에 의존하지 마세요.

  • 개발용 빌드 일반적으로 라이브 업데이트 확인을 무시하거나 전용 테스트 채널을 가리켜야 합니다.
  • 스테이징 빌드 제품 환경과 비슷하게 동작해야 하지만 고립된 롤아웃 스트림에 대하여 테스트해야 합니다.
  • 제품용 빌드 내부 QA 트래픽과 채널을 공유하지 않아야 합니다.

체크 중인 사용자가 오프라인입니다.

증상: 사용자가 네트워크 연결이 없을 때 앱을 열면 업데이트 상태가 깨진 상태로 나타납니다.

가능한 원인: 체크 경로가 네트워크 성공을 가정하고 실패를 오류 UI로 대신하는 대신 중립적인 상태로 맵핑합니다.

Fix: 현재 버전을 유지하고 실패한 체크 기록을 저장한 다음 앱이 다시 활성화 될 때까지 나중에 다시 시도하십시오.

오프라인은 정상적인 런타임 상태이며 예외적인 상태가 아닙니다.

강제 업데이트에 대한 경우, 오프라인 경로에는 특별한 주의가 필요합니다. 만약 최소 지원 버전이 이미 유효하지 않다면, 앱이 블록되도록 유지해야 할 수 있습니다. 그 경우, 네트워크 연결이 돌아올 때까지 다시 시도할 수 있는 이유를 명확하게 설명하고, 사용자를 임시 네트워크 손실로 벌리지 마십시오. 만약 업데이트가 선택적이라면.

이러한 모든 경우의 반복되는 원칙은 간단합니다: 탐지, 정책, UI, 활성화. 그때의 문제는, 그들 중 하나의 hook 또는 하나의 화면 컴포넌트로 합쳐지면, 디버깅이 추측으로 변하는 것입니다.


If your team is shipping Capacitor or Electron apps and you need a controlled update system with channels, signed bundle delivery, rollback protection, and device-level observability, Capgo __CAPGO_KEEP_0__이 평가할 가치가 있습니다. 팀이 릴리스 인프라 대신 손수 만든 사이드 프로젝트처럼 동작하는 라이브 업데이트를 원한다면.

__CAPGO_KEEP_0__에서 계속 진행하세요. 효과적인 앱 업데이트 알림 전략

__CAPGO_KEEP_0__을 사용하고 있다면 효과적인 앱 업데이트 알림 전략 CI/CD 자동화 계획을 위해 연결하세요. Capgo CI/CD Capgo CI/CD에서 제품 워크플로우 Capgo Native Builds Capgo Native Builds에서 제품 워크플로우 Capgo Integrations Capgo Integrations에서 제품 워크플로우 CI/CD 통합 CI/CD 통합 구현 세부 사항에 대해, 그리고 GitHub 액션 통합 GitHub 액션 통합 구현 세부 사항에 대해.

Capacitor 앱에 대한 실시간 업데이트

웹-layer 버그가 활성화된 경우 앱 스토어 승인까지 며칠 기다리지 않고 Capgo을 통해 패치를 배포하세요. 사용자는 배경에서 업데이트를 받으면서 네이티브 변경 사항은 일반적인 리뷰 경로에 남아 있습니다.

시작하기

최신 블로그 글

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