更新记录

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 同上 + 不随备份迁移(默认

非法值自动回退默认值并输出告警日志。

使用须知

  1. 卸载重装数据保留:iOS Keychain 数据在 App 卸载重装后默认仍在(设备抹除才清空)。改了 account 名后旧数据不会自动消失,需要清理时用 wipeAllSync()
  2. 空值判断用 == null:uni-app x 下返回 null;uni-app (js) 下经 UTS proxy 返回的实际是 undefined。判断一律写 == null,不要用 === null
  3. 只管理本插件写入的普通条目:读到带生物识别保护的条目时会立即失败(errCode=9013001),不会阻塞弹认证框。
  4. 本插件不抛异常:失败通过返回值(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 原生混编)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。