kintex/mobile
zio 490b723a45 chore(mobile): v0.2.0 source snapshot for reproducibility
- app.json: version 0.2.0 / versionCode 2, drop expo-screen-capture plugin
- add lib/i18n (ko/en/ja/zh), lib/roleTrack, LanguageContext + LanguageSelector
- profile/security hardening across screens (login/register/forgot/profile/tabs)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 00:29:38 +09:00
..
app chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
assets fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00
components chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
context chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
lib chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
theme fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00
.gitignore fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00
app.json chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
babel.config.js fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00
eas.json fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00
expo-env.d.ts fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00
package-lock.json chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
package.json chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
README.md chore(mobile): v0.2.0 source snapshot for reproducibility 2026-07-13 00:29:38 +09:00
tsconfig.json fix(schedule,ui): holidays on exhibition calendar, bilingual brand, neutral calendar borders 2026-07-12 19:16:48 +09:00

KINTEX AI 전시관리 — 모바일 앱 (mobile/)

React Native + Expo(expo-router, TypeScript) 모바일 앱. 조회·승인·현장 시나리오 전용 (design.md §4). 백엔드는 공유 API https://kintex.zioinfo.co.kr.

스택

  • Expo SDK 51 · expo-router ~3.5 · React Native 0.74 · TypeScript
  • JWT는 expo-secure-store(네이티브 keychain/keystore)에 저장, 웹은 AsyncStorage 폴백
  • 디자인 토큰: theme/(docs/design.md §1 팔레트·타이포). 신규 토큰 없음.
  • 다국어: react-i18next + expo-localization(SDK51 호환). 지원 ko(기본/폴백)·en·zh·ja.

다국어(i18n)

  • 초기화 lib/i18n/(동기 init — 디바이스 로케일 감지, 저장 선택은 부팅 시 반영). 리소스 lib/i18n/locales/{ko,en,zh,ja}.ts.
  • ko가 키 형상의 단일 출처 — en/zh/ja는 Translations(DeepString) 타입 구현이라 키 누락 시 tsc가 잡음(병렬 편집 함정 회피: 직렬·키 대조).
  • 언어 선택 지속: AsyncStorage 키 kintex_lang. 전환 UI components/LanguageSelector.tsx(더보기·내정보에 배치), 상태 context/LanguageContext.tsx.
  • 커버 화면(우선순위): 로그인/2FA·회원가입·비번찾기·홈·현장·갤러리·더보기·내정보·티켓 지갑·탭/스택 타이틀·역할 라벨. 미커버(폴백=현행 한국어): checklist·inspection·tickets/select·티켓 카드/필터탭 컴포넌트(components/tickets/*).

역할별 랜딩

  • lib/roleTrack.ts — 웹 src/frontend/src/lib/roleTrack.ts 패리티(우선순위 admin>ops>business>agency>visitor, 미판정=visitor 기본).
  • 로그인 응답 user에 roleCode가 없어 hallManager를 ops 신호로 사용(roleCode 아는 호출부는 옵션 전달).
  • 모바일 랜딩 매핑: admin/ops/business→/(tabs) 홈 · agency(장치·시공)→/(tabs)/field · visitor(관람객)→/tickets.
  • 콜드 부팅 시 workspaces 미복원 misroute 방지 위해 로그인 시 계산한 랜딩 경로를 secure-store에 지속(AuthContext).

실행

cd mobile
npm install
npm run typecheck   # tsc --noEmit
npm start           # Expo 개발 서버 (Expo Go / 에뮬레이터)

API 베이스는 app.json > extra.apiBase 또는 EXPO_PUBLIC_API_BASE 환경변수로 재정의. 시크릿(키 등)은 하드코딩하지 않는다.

화면

경로 화면 근거
app/login.tsx 로그인(2FA/OTP·아이디 기억·비번찾기/회원가입) SCR-01
app/register.tsx 회원가입 04_backend_public_auth §1
app/forgot-password.tsx 비밀번호 찾기/초기화 04 §2·§3
app/(tabs)/index.tsx 홈/대시보드(역할별 진입) design §2-2
app/(tabs)/field.tsx 현장 허브(역할 분기)
app/(tabs)/gallery.tsx 시각화 갤러리(워터마크 상시) SCR-12
app/(tabs)/more.tsx 계정(내정보 진입)·서버 상태·로그아웃
app/profile.tsx 내정보(WISE mypage 이식·생체인식 잠금·프로필 사진 등록) WISE uiws/mypage.tsx
app/checklist.tsx 현장 체크리스트(48px 터치·오프라인·사진) SCR-M1
app/inspection.tsx 현장 검수(승인/반려·AI 플래그) SCR-M2

계약·보안 준수

  • 응답 오류 봉투 { success, data, error } 처리(lib/api.ts), degraded 폴백(isDegraded).
  • AI 생성 이미지는 components/AiImage.tsx가 워터마크 + "AI 생성 예상 이미지" 고지를 항상 표시(제거 불가).
  • 비밀번호는 저장하지 않음. "아이디 기억"은 이메일만 AsyncStorage 보관.

보안 하드닝(위변조 방지 · 화면보호)

근거: docs/security/mobile-security-audit.md(B1~B13) · 상세: _workspace/08_mobile_security_hardening.md. 모두 방어적(네이티브 미지원 기기 graceful).

  • 위변조 탐지(B1/B9): lib/integrity.ts(jail-monkey) — 루팅·후킹·디버거·개발자모드·USB 디버깅 탐지. 로그인 시 비차단 경고(공공 대민 정책).
  • 화면캡처 방지(B4)+백그라운드 마스킹(B7): context/SecureScreenContext.tsxuseSecureScreen(key) — 2FA 로그인·티켓 QR·내정보에서 캡처 차단(FLAG_SECURE)+태스크 스위처 마스킹.
  • 난독화(B3)·cleartext 차단(B5)·권한 최소화(B10): app.json(Hermes·expo-build-properties R8/ProGuard·usesCleartextTraffic:false·iOS ATS·android.permissions/blockedPermissions).
  • 앱 무결성 토큰(B2 전송부): lib/api.tsX-Integrity-Token 조건부 첨부(발급기 등록 시). 서버 검증은 backend-dev 인계.
  • 한계: 인증서 피닝(B6)은 회귀 위험으로 미도입 — 커스텀 config plugin 경로 문서화(_workspace/08). EAS 실빌드는 devops·G3 게이트.

남은 작업

  • 실 화면 데이터 API 배선 확대(부스 목록·검수 요청 제출 — 백엔드 M6/C-4 확장 대기).
  • 앱 아이콘/스플래시 에셋(assets/), 푸시 알림.
  • i18n 잔여 화면 키 추출: checklist·inspection·tickets/select·components/tickets/*(현재 한국어 폴백).
  • EAS 실빌드(eas.json 프로파일) — G3 게이트(소유자 승인).