ネイティブストレージ
安全なネイティブのキーバリューストレージ — TEMP / PERM / SECURE の 3 段階
概要
Storage Bridge を使うと、ウェブからネイティブのストレージにデータを読み書きできます。Android と iOS で同じ JS API を使用します。
| タイプ | 保存方式 | 削除されるタイミング | 用途 |
|---|---|---|---|
TEMP | インメモリ (Map) | アプリ再起動時 | セッション中の一時的な状態 |
PERM | SharedPreferences (Android) / UserDefaults (iOS) | アプリ削除または clearData 呼び出し時 | ユーザー設定、機微でないデータ |
SECURE | EncryptedSharedPreferences (Android) / Keychain (iOS) | アプリ削除または clearSecureData 呼び出し時 | トークン、セッション、PII などの機微データ |
ストレージはアプリごとに分離されます。他のアプリからはアクセスできません。
SECURE ティア: Android は AndroidKeyStore ベースの AES256-GCM 暗号化、iOS は Secure Enclave ベースの Keychain を使用します。どちらのプラットフォームでもハードウェアセキュリティモジュールで保護されます。
API
saveData
データを保存します。
window.unveilyBridge.saveData(key, value, type)
// type: "TEMP" | "PERM" | "SECURE"// 一時保存 (セッション中のみ維持)
window.unveilyBridge.saveData("sessionStep", "2", "TEMP");
// 永久保存 (アプリ再起動後も維持)
window.unveilyBridge.saveData("theme", "dark", "PERM");
// 保安保存 (暗号化 — トークン、機微情報)
window.unveilyBridge.saveData("accessToken", "eyJ...", "SECURE");loadData
データを同期的に読み込みます。SECURE タイプには使用不可 — loadSecureData を使用してください。
const value = window.unveilyBridge.loadData(key, type)
// type: "TEMP" | "PERM"
// 戻り値: 保存された文字列、なければ ""const theme = window.unveilyBridge.loadData("theme", "PERM");
if (theme === "dark") applyDarkMode();loadSecureData
SECURE ストレージから非同期で読み込みます。
window.unveilyBridge.loadSecureData(key, callbackFunctionName)window.unveilyBridge.loadSecureData("accessToken", "onTokenLoaded");
function onTokenLoaded(result) {
if (result.success) {
console.log("トークン:", result.value);
} else {
console.log("保存されたトークンなし");
}
}コールバックのレスポンス構造
{ "success": true, "value": "eyJ..." }
{ "success": false, "value": null }loadData(key, "SECURE") は常に空文字列を返します。SECURE ストレージの読み込みには必ず loadSecureData を使用してください。
removeData
特定のキーのデータを削除します。
window.unveilyBridge.removeData(key, type)
// type: "TEMP" | "PERM" | "SECURE"window.unveilyBridge.removeData("theme", "PERM");
window.unveilyBridge.removeData("accessToken", "SECURE");clearData
TEMP / PERM 全体を初期化します。
window.unveilyBridge.clearData(type)
// type: "TEMP" | "PERM" | "ALL"window.unveilyBridge.clearData("TEMP"); // 一時保存をすべて削除
window.unveilyBridge.clearData("PERM"); // 永久保存をすべて削除
window.unveilyBridge.clearData("ALL"); // TEMP + PERM をすべて削除clearData は SECURE ストレージには影響しません。SECURE データを削除するには clearSecureData を使用してください。
clearSecureData
SECURE ストレージから特定のキーを削除します。
window.unveilyBridge.clearSecureData(keysJson)
// keysJson: 削除するキー一覧の JSON 配列文字列// ログアウト時に認証関連のキーを削除
window.unveilyBridge.clearSecureData(JSON.stringify(["accessToken", "refreshToken"]));使用パターン
ログイン / ログアウト
// ログイン成功後 — トークンは SECURE に保存
async function onLoginSuccess(token, user) {
window.unveilyBridge.saveData("accessToken", token, "SECURE");
window.unveilyBridge.saveData("userProfile", JSON.stringify(user), "PERM");
}
// アプリ起動時 — SECURE は非同期で読み込む
function checkAuth() {
window.unveilyBridge.loadSecureData("accessToken", "onAuthChecked");
}
function onAuthChecked(result) {
if (result.success && result.value) {
// 自動ログイン処理
initApp(result.value);
} else {
showLoginScreen();
}
}
// ログアウト時 — 認証データを削除
function logout() {
window.unveilyBridge.clearSecureData(JSON.stringify(["accessToken", "refreshToken"]));
window.unveilyBridge.removeData("userProfile", "PERM");
}グルー準備後の初期化
window.addEventListener("unveilyGlueReady", () => {
// ブリッジ準備完了後にストレージへアクセス
checkAuth();
});