- 자체 구현(네이티브 플러그인 없음): PIN은 SHA-256 해시만 저장, 기본 OFF 옵트인 - 앱 시작(저장 세션 재진입)·백그라운드 복귀 시 잠금 화면 노출 - 설정에 앱 잠금 토글 + PIN 설정(입력→확인 2단계) 모달 - 갇힘 방지: 잠금 화면에서 'PIN 분실 → 로그아웃'(잠금 해제 후 로그아웃) - 신규/민감정보 앱 신뢰도 향상 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+15
@@ -9,6 +9,8 @@ import LoginModal from '@/components/LoginModal.vue'
|
||||
import SignupModal from '@/components/SignupModal.vue'
|
||||
import WebOnlyNotice from '@/components/WebOnlyNotice.vue'
|
||||
import AppDialog from '@/components/ui/AppDialog.vue'
|
||||
import AppLockScreen from '@/components/AppLockScreen.vue'
|
||||
import { appLock } from '@/composables/appLock'
|
||||
import { Capacitor } from '@capacitor/core'
|
||||
import { reminders } from '@/native/reminders'
|
||||
import { useAuthStore } from '@/stores/auth'
|
||||
@@ -71,6 +73,12 @@ function retryReload() {
|
||||
window.location.reload()
|
||||
}
|
||||
|
||||
// ===== 앱 잠금(PIN) =====
|
||||
// 백그라운드로 가면 잠가서, 복귀 시 잠금 화면이 떠 있도록 한다.
|
||||
function onVisibility() {
|
||||
if (document.hidden) appLock.lock()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
if (!isApp) return // 웹은 안내만 — 앱 전용 초기화 생략
|
||||
window.addEventListener('auth:unauthorized', onUnauthorized)
|
||||
@@ -78,6 +86,9 @@ onMounted(() => {
|
||||
window.addEventListener('online', onOnline)
|
||||
window.addEventListener('offline', onOffline)
|
||||
window.addEventListener('net:error', onNetError)
|
||||
// 앱 잠금: 저장된 세션으로 재진입하는 경우 시작 시 잠금(새 로그인 직후는 잠그지 않음)
|
||||
if (appLock.state.enabled && appLock.hasSession()) appLock.lock()
|
||||
document.addEventListener('visibilitychange', onVisibility)
|
||||
ui.loadSignupEnabled() // 회원가입 허용 여부 선로딩(랜딩/로그인 가입 버튼에 반영)
|
||||
// 로그인 상태면 전체 프로필(아바타·포인트) 최신화 — 재로그인 없이 헤더 아바타 반영
|
||||
if (auth.isAuthenticated) {
|
||||
@@ -99,6 +110,7 @@ onUnmounted(() => {
|
||||
window.removeEventListener('online', onOnline)
|
||||
window.removeEventListener('offline', onOffline)
|
||||
window.removeEventListener('net:error', onNetError)
|
||||
document.removeEventListener('visibilitychange', onVisibility)
|
||||
clearTimeout(netTimer)
|
||||
})
|
||||
|
||||
@@ -115,6 +127,9 @@ watch(() => route.fullPath, () => ui.closeSidebar())
|
||||
|
||||
<!-- 앱(Capacitor): 전체 기능 -->
|
||||
<template v-else>
|
||||
<!-- 앱 잠금 화면 (로그인 상태 + 잠금 활성 시) -->
|
||||
<AppLockScreen v-if="appLock.state.locked && auth.isAuthenticated" />
|
||||
|
||||
<!-- 네트워크 오류/오프라인 안내 배너 -->
|
||||
<Transition name="netbar">
|
||||
<div v-if="showNetBanner" class="net-banner" role="alert">
|
||||
|
||||
Reference in New Issue
Block a user