更新记录
1.0.0(2026-08-23)
- 首版:iOS Keychain 安全键值存储,支持 uni-app 与 uni-app x
平台兼容性
uni-app(5.24)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| - |
- |
- |
- |
- |
- |
- |
√ |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(5.24)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
- |
√ |
- |
- |
iOS Keychain 安全存储
基于 iOS Keychain 的安全键值存储(UTS 插件,全同步 API)。适用于 token、设备凭证等敏感数据。同一份源码同时支持 uni-app(vue2/vue3)与 uni-app x。
平台支持
| 平台 |
状态 |
| uni-app x · iOS |
✅ |
| uni-app · app-vue · iOS |
✅ |
| Android / HarmonyOS / web / 小程序 |
❌ 未实现(调用返回兜底值并输出告警) |
快速上手
import { setSync, getSync, removeSync } from '@/uni_modules/hans-key-chain'
setSync({ account: 'refreshToken', value: 'your-token' })
const token = getSync({ account: 'refreshToken' }) // string | null
removeSync({ account: 'refreshToken' }) // 幂等,不存在也返回 true
uni-app x 中可使用强类型:
import { setSync, getSync, SetOptions, GetOptions } from '@/uni_modules/hans-key-chain'
const so = { account: 'refreshToken', value: 'your-token' } as SetOptions
setSync(so)
const go = { account: 'refreshToken' } as GetOptions
const token = getSync(go)
页面侧只允许从 @/uni_modules/hans-key-chain 导入。
API
全部为同步方法:
| 方法 |
签名 |
说明 |
setSync |
(options: SetOptions) => boolean |
写入;已存在则覆盖更新。true=成功 |
getSync |
(options: GetOptions) => string \| null |
读取;null = 不存在或失败 |
removeSync |
(options: GetOptions) => boolean |
删除;幂等(不存在亦 true) |
existsSync |
(options: GetOptions) => boolean |
是否存在 |
getAllAccountsSync |
(service?: string) => string[] |
枚举某 service 下全部 account 键名(不含值) |
wipeAllSync |
(service?: string) => number |
清空某 service 下全部条目;返回删除条数 |
setLogEnabled |
(enabled: boolean) => void |
开关日志(默认关) |
isLogEnabled |
() => boolean |
查询日志开关 |
参数说明
| 字段 |
类型 |
必填 |
说明 |
account |
string |
✅ |
条目键名,非空 |
value |
string |
✅(set) |
条目值,非空 |
service |
string |
- |
命名空间;缺省 = 宿主 App bundle identifier |
accessible |
string |
- |
可访问性策略,见下表 |
accessible 取值
| 值 |
行为 |
whenUnlocked |
仅设备解锁时可读写 |
whenUnlockedThisDeviceOnly |
同上 + 不随备份迁移到新设备 |
afterFirstUnlock |
首次解锁后始终可读写(含后台) |
afterFirstUnlockThisDeviceOnly |
同上 + 不随备份迁移(默认) |
非法值自动回退默认值并输出告警日志。
使用须知
- 卸载重装数据保留:iOS Keychain 数据在 App 卸载重装后默认仍在(设备抹除才清空)。改了 account 名后旧数据不会自动消失,需要清理时用
wipeAllSync()。
- 空值判断用
== null:uni-app x 下返回 null;uni-app (js) 下经 UTS proxy 返回的实际是 undefined。判断一律写 == null,不要用 === null。
- 只管理本插件写入的普通条目:读到带生物识别保护的条目时会立即失败(errCode=9013001),不会阻塞弹认证框。
- 本插件不抛异常:失败通过返回值(false / null)表达,具体原因开日志查看。
错误码
| errCode |
含义 |
| 9010001 |
参数非法(account/value 为空、accessible 非法回退告警) |
| 9011001 |
写入失败 |
| 9011002 |
条目不存在 |
| 9011003 |
读取失败 |
| 9012001 |
删除失败 |
| 9013001 |
条目受认证保护且拒绝交互 |
| 9099999 |
未知内部错误 |
排障
import { setLogEnabled } from '@/uni_modules/hans-key-chain'
setLogEnabled(true)
日志输出到 HBuilderX 控制台,格式 [hans-key-chain][方法名] 描述 [errCode=xxxx]。
已知边界
- 单条大值建议 ≤ 数百 KB(keychain 不适合存大数据)
- iOS 模拟器 Erase All Content 会清 keychain;「卸载重装保留」需在真机验收
- 环境要求:HBuilderX 4.25+(Swift 原生混编)