From 6972cb5a63aef2fe3b2ca49526ed602e284fdd12 Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Mon, 29 Jun 2026 09:11:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?docs(brand):=20=EC=B6=9C=EC=8B=9C=20?= =?UTF-8?q?=EC=A0=84=20=EB=8B=A4=EB=93=AC=EA=B8=B0=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=EC=83=81=ED=99=A9=20=EA=B0=B1=EC=8B=A0(=EB=B9=88=EC=83=81?= =?UTF-8?q?=ED=83=9C=C2=B7=EC=98=A4=ED=94=84=EB=9D=BC=EC=9D=B8=C2=B7?= =?UTF-8?q?=EC=95=B1=EC=9E=A0=EA=B8=88=C2=B7=EC=97=90=EB=9F=AC=ED=8F=B4?= =?UTF-8?q?=EB=B0=B1=C2=B7=EB=92=A4=EB=A1=9C=EA=B0=80=EA=B8=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- brand/LAUNCH-PROGRESS.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/brand/LAUNCH-PROGRESS.md b/brand/LAUNCH-PROGRESS.md index 3f60bbf..72bf3a4 100644 --- a/brand/LAUNCH-PROGRESS.md +++ b/brand/LAUNCH-PROGRESS.md @@ -87,11 +87,14 @@ ## πŸ’‘ μΆœμ‹œ μ „ 닀듬기 후보 (λŒ€κΈ° μ‹œκ°„ ν™œμš©, 선택) μ‹ κ·œ(λΉˆμ†) μœ μ € κ²½ν—˜ μœ„μ£Ό β€” μ €μœ„ν—˜Β·κ³ νš¨μœ¨ 순: -1. **빈 μƒνƒœ β†’ 행동 μœ λ„** (첫 λ‚΄μ—­/κ³„μ’Œ μΆ”κ°€ CTA) ⭐ μž„νŒ©νŠΈ 高/λ…Έλ ₯ 低 -2. **μ˜€ν”„λΌμΈΒ·λ„€νŠΈμ›Œν¬ 였λ₯˜ UX 견고화** (폐쇄 ν…ŒμŠ€νŠΈ λŒ€λΉ„) -3. 첫 μ‹€ν–‰ μ˜¨λ³΄λ”©(μ‹œμž‘ν•˜κΈ° μΉ΄λ“œ) -4. Play 인앱 리뷰 μš”μ²­ -5. (선택) μ•± 잠금(PIN/생체) β€” λ§€λ‹ˆνŽ˜μŠ€νŠΈμ— USE_BIOMETRIC κΆŒν•œ 쑴재, κ΅¬ν˜„ μ—¬λΆ€ 미확인 +1. βœ… **빈 μƒνƒœ β†’ 행동 μœ λ„** (μ™„λ£Œ) β€” ν™ˆ 'μ‹œμž‘ν•˜κΈ°' μΉ΄λ“œ + 가계뢀내역/κ³„μ’Œ 빈 μƒνƒœ CTA. 데이터 0 κ³„μ •μ—μ„œλ§Œ λ…ΈμΆœ +2. βœ… **μ˜€ν”„λΌμΈΒ·λ„€νŠΈμ›Œν¬ 였λ₯˜ λ°°λ„ˆ** (μ™„λ£Œ) β€” http net:error 이벀트 + App.vue 상단 κ³ μ • λ°°λ„ˆ(μ˜€ν”„λΌμΈ/μ„œλ²„μ—°κ²°μ‹€νŒ¨, μƒˆλ‘œκ³ μΉ¨ λ²„νŠΌ) +3. βœ… **μ•± 잠금(PIN)** (μ™„λ£Œ) β€” 자체 κ΅¬ν˜„(ν•΄μ‹œ μ €μž₯, κΈ°λ³Έ OFF), μ‹œμž‘Β·λ³΅κ·€ μ‹œ 잠금, μ„€μ • ν† κΈ€+PINμ„€μ • λͺ¨λ‹¬, 'PIN λΆ„μ‹€β†’λ‘œκ·Έμ•„μ›ƒ' κ°‡νž˜ λ°©μ§€. μƒμ²΄λŠ” μΆ”ν›„(λ„€μ΄ν‹°λΈŒ ν”ŒλŸ¬κ·ΈμΈ ν•„μš”) +4. βœ… **μ „μ—­ μ—λŸ¬ 폴백** (μ™„λ£Œ) β€” errorHandler + onErrorCaptured β†’ 흰 ν™”λ©΄ λŒ€μ‹  '문제 λ°œμƒ + μƒˆλ‘œκ³ μΉ¨' +5. βœ… **μ•ˆλ“œλ‘œμ΄λ“œ λ’€λ‘œκ°€κΈ° κ°œμ„ ** (μ™„λ£Œ) β€” μ˜€λ²„λ ˆμ΄ λ‹«κΈ° μš°μ„  β†’ ν™”λ©΄ λ’€λ‘œ β†’ μ΅œμƒμœ„ 'ν•œ 번 더 λˆ„λ₯΄λ©΄ μ’…λ£Œ' ν† μŠ€νŠΈ +6. 첫 μ‹€ν–‰ μ˜¨λ³΄λ”©(1번과 쀑볡이라 보λ₯˜) / Play 인앱 리뷰(ν”ŒλŸ¬κ·ΈμΈ ν•„μš”, μΆœμ‹œ ν›„) / 생체인증(μΆœμ‹œ ν›„) + +> ⚠️ μ•± μž κΈˆμ€ μ‹œμž‘ 흐름을 κ°€λ‘œμ±„λŠ” κΈ°λŠ₯이라 **μ‹€κΈ°κΈ° 검증 ꢌμž₯**: μ„€μ •β†’μ•±μž κΈˆ ONβ†’PIN μ„€μ •β†’λ°±κ·ΈλΌμš΄λ“œ ν›„ λ³΅κ·€β†’μž κΈˆν™”λ©΄ 확인→PIN ν•΄μ œ. (ν˜„μž¬ μ„€μΉ˜ APKμ—” 미반영 β€” μž¬λΉŒλ“œΒ·μž¬μ„€μΉ˜ ν•„μš”) --- From b50a81028f3cad66b4bdae970cb843a84547cee1 Mon Sep 17 00:00:00 2001 From: ByungCheol Date: Mon, 29 Jun 2026 09:25:57 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=ED=95=98=EB=8B=A8=20=EB=82=B4?= =?UTF-8?q?=EB=B9=84=20=EB=92=A4=EB=A1=9C=20=EB=B2=84=ED=8A=BC=EB=8F=84=20?= =?UTF-8?q?=ED=95=98=EB=93=9C=EC=9B=A8=EC=96=B4=20=EB=92=A4=EB=A1=9C?= =?UTF-8?q?=EC=99=80=20=EB=8F=99=EC=9D=BC=20=EB=8F=99=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 톡합 ν•Έλ“€λŸ¬ appBack.handleBack μΆ”μΆœ: μ˜€λ²„λ ˆμ΄ λ‹«κΈ° β†’ ν™”λ©΄ λ’€λ‘œ β†’ μ΅œμƒμœ„μ—μ„œ 'ν•œ 번 더 λˆ„λ₯΄λ©΄ μ’…λ£Œ' ν† μŠ€νŠΈ(λ„€μ΄ν‹°λΈŒ) - ν•˜λ‹¨ λ‚΄λΉ„ λ’€λ‘œ λ²„νŠΌμ΄ μ˜› 둜직(ν™ˆμ—μ„œ λ¬΄λ°˜μ‘)이라 ν•˜λ“œμ›¨μ–΄ λ’€λ‘œμ™€ λ™μž‘μ΄ λ‹¬λžλ˜ 문제 ν•΄κ²° β€” λ‘˜μ΄ 같은 ν•Έλ“€λŸ¬ μ‚¬μš© - capacitor.js 쀑볡 둜직 제거 Co-Authored-By: Claude Opus 4.8 --- src/capacitor.js | 30 ++------------------ src/components/layout/AppBottomNav.vue | 6 ++-- src/composables/appBack.js | 39 ++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 src/composables/appBack.js diff --git a/src/capacitor.js b/src/capacitor.js index 0605ad8..c01203c 100644 --- a/src/capacitor.js +++ b/src/capacitor.js @@ -1,37 +1,13 @@ // Capacitor λ„€μ΄ν‹°λΈŒ(μ•ˆλ“œλ‘œμ΄λ“œ) 톡합. μ›Ήμ—μ„œλŠ” no-op. import { Capacitor } from '@capacitor/core' import { App as CapApp } from '@capacitor/app' -import { useUiStore } from '@/stores/ui' -import { appLock } from '@/composables/appLock' +import { handleBack } from '@/composables/appBack' export function setupCapacitor(router) { if (!Capacitor.isNativePlatform()) return - const ui = useUiStore() - let exitArmed = false - let exitTimer = null - - // μ•ˆλ“œλ‘œμ΄λ“œ ν•˜λ“œμ›¨μ–΄ λ’€λ‘œκ°€κΈ° μš°μ„ μˆœμœ„: - // 1) 잠금 화면이면 우회 λΆˆκ°€ β†’ μ’…λ£Œ - // 2) μ—΄λ¦° μ „μ—­ μ˜€λ²„λ ˆμ΄(νšŒμ›κ°€μž…/둜그인/λΉ„λ²ˆ/μ‚¬μ΄λ“œλ°”) λ‹«κΈ° - // 3) ν™”λ©΄ λ’€λ‘œ - // 4) μ΅œμƒμœ„μ—μ„œ ν•œ 번 더 λˆ„λ₯΄λ©΄ μ’…λ£Œ(μ‹€μˆ˜ μ’…λ£Œ λ°©μ§€) - CapApp.addListener('backButton', ({ canGoBack }) => { - if (appLock.state.locked) { CapApp.exitApp(); return } - - if (ui.signupOpen) { ui.closeSignup(); return } - if (ui.loginOpen) { ui.closeLogin(); return } - if (ui.passwordOpen) { ui.closePassword(); return } - if (ui.sidebarOpen) { ui.closeSidebar(); return } - - if (canGoBack && window.history.length > 1) { router.back(); return } - - if (exitArmed) { CapApp.exitApp(); return } - exitArmed = true - window.dispatchEvent(new CustomEvent('app:toast', { detail: 'ν•œ 번 더 λˆ„λ₯΄λ©΄ μ’…λ£Œλ©λ‹ˆλ‹€' })) - clearTimeout(exitTimer) - exitTimer = setTimeout(() => { exitArmed = false }, 2000) - }) + // μ•ˆλ“œλ‘œμ΄λ“œ ν•˜λ“œμ›¨μ–΄ λ’€λ‘œκ°€κΈ° β†’ ν•˜λ‹¨ λ‚΄λΉ„ λ’€λ‘œ λ²„νŠΌκ³Ό λ™μΌν•œ 톡합 처리 + CapApp.addListener('backButton', () => handleBack(router)) // λ„€μ΄ν‹°λΈŒ ν‘œμ‹œμš© 클래슀 (safe-area λ“± μŠ€νƒ€μΌ λΆ„κΈ°) document.documentElement.classList.add('is-native') diff --git a/src/components/layout/AppBottomNav.vue b/src/components/layout/AppBottomNav.vue index b014907..862b685 100644 --- a/src/components/layout/AppBottomNav.vue +++ b/src/components/layout/AppBottomNav.vue @@ -1,6 +1,7 @@