アーキテクチャ
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)として提供します。