전체 구조
Unveily가 웹앱과 네이티브 기능을 연결하는 방식
전체 구조
구성 요소
WebView Layer
- Android는
WebView, iOS는WKWebView컴포넌트 기반 TRUSTED_WEB_URL(iOS는UnveilyInitialURL) 도메인만 허용 (보안 격리)- JavaScript Interface로 Bridge와 통신
Bridge Layer
웹 ↔ 네이티브 통신 인터페이스. 전역 객체 window.unveilyBridge로 노출되며, 페이지 주입이 끝나면 unveilyGlueReady 이벤트가 발생합니다. 활성화된 모듈/플랜은 unveilyBridge.app.getInfo()(tier·features)와 unveilyBridge.modules.isEnabled(name)로 확인합니다. 플랜별 기능:
Basic: QR·카메라·위치 | 저장소(TEMP/PERM/SECURE) | 오프라인 캐시 | 푸시(FCM)
| 접근성 패널 + TTS/STT/햅틱 | bottomTabs · topDownMenu | Google·Apple 로그인
Standard: Basic + 생체인증 · sideDrawer · Kakao/Naver/LINE 로그인
Pro: Standard + 인앱결제(IAP) · Meta 로그인플랫폼별 네이티브 구현 매핑:
| 기능 | Android | iOS |
|---|---|---|
| SECURE 스토리지 | AndroidKeyStore | iOS Keychain |
| 생체인증 | BiometricPrompt | Face ID / Touch ID |
| 인앱결제 | Google Play Billing | StoreKit 2 |
License Manager
앱 시작 시 라이선스 검증:
- 로컬 파일(
license.key) 읽기 및 HMAC 검증 - 서버 온라인 검증 (만료일, 활성화 여부 확인)
- 성공 시 WebView 실행 허용
SSL Pinning
SslPinningManager가 API 서버 인증서 핀(SHA-256)을 검증합니다.
중간자 공격(MITM)으로부터 라이선스 통신을 보호합니다.
Flavor 구조 (Android)
Android에서 Unveily는 3가지 Product Flavor를 사용합니다:
| Flavor | applicationId 접미사 | 포함 기능 |
|---|---|---|
basic | .basic | 기본 기능 전체 |
standard | .standard | Basic + 생체인증 |
pro | .pro | Standard + 인앱결제 |
각 Flavor는 독립적인 APK/AAB로 빌드됩니다. iOS는 동일한 플랜 구분을 별도의 타깃/스킴(Basic/Standard/Pro)으로 제공합니다.