Skip to content

iOS 常量 agent/src/ios/lib/constants.ts ​

constants.ts 定义 iOS 平台专用的枚举与标量常量:kSec(Keychain 属性四字符码)、NSSearchPaths、NSUserDomainMask、NSUTF8StringEncoding、BundleType。被 keychain.ts 与 bundles.ts 复用,是 iOS ObjC 桥与 Security 框架 API 之间的"魔法字符串"对照表。

📋 模块概览 ​

项目值
文件路径agent/src/ios/lib/constants.ts
平台iOS
导出 RPC无(常量库)
依赖无

🎯 解决的问题 ​

  • 把 Keychain API 内部的四字符码(如 acct、v_Data、m_LimitAll)集中成可读枚举,避免散落硬编码。
  • 提供 BundleType 枚举让 bundles.ts 选择 allFrameworks / allBundles。
  • 提供 NSUTF8StringEncoding = 4 给 keychain / helpers 在 NSString 转码时使用。

🏗️ 导出的方法 ​

符号说明
enum kSecKeychain 查询/属性 key 与 item class 的字符串值
enum NSSearchPathsNSSearchPathDirectory 枚举镜像
NSUserDomainMask= 1
NSUTF8StringEncoding= 4
enum BundleTypeNSBundleFramework=1、NSBundleAllBundles=2

⚙️ 实现要点 ​

kSec 枚举存的不是数字而是字符串,因为这些常量在 Security 框架内部就是字符串 key(通过 NSLog echo 得到,源码注释 :8-10):

ts
// agent/src/ios/lib/constants.ts:12-22
export enum kSec {
  kSecReturnAttributes = "r_Attributes",
  kSecReturnData = "r_Data",
  kSecReturnRef = "r_Ref",
  kSecMatchLimit = "m_Limit",
  kSecMatchLimitAll = "m_LimitAll",
  kSecClass = "class",
  kSecClassKey = "keys",
  kSecClassIdentity = "idnt",
  kSecClassCertificate = "cert",
  kSecClassGenericPassword = "genp",
  kSecClassInternetPassword = "inet",
  // ... 属性 key 继续
}

keychain.ts 把这些枚举值作为 NSMutableDictionary 的 key 传入 SecItemCopyMatching / SecItemAdd / SecItemDelete / SecItemUpdate(见 keychain.ts:79-83、:215 等)。reverseEnumLookup(kSec, value) 还能把查到的值反查为可读 key 名,用于 accessible_attribute 字段(keychain.ts:135-136)。

BundleType 由 rpc/ios.ts:93-94 在调用 bundles.getBundles 时固定传入:

ts
// agent/src/ios/lib/constants.ts:100-103
export enum BundleType {
  NSBundleFramework = 1,
  NSBundleAllBundles,
}

📐 调用关系 ​

🔍 源码索引 ​

符号位置
kSecagent/src/ios/lib/constants.ts:3
NSSearchPathsagent/src/ios/lib/constants.ts:80
NSUserDomainMaskagent/src/ios/lib/constants.ts:97
NSUTF8StringEncodingagent/src/ios/lib/constants.ts:98
BundleTypeagent/src/ios/lib/constants.ts:100

🔗 相关文档 ​

基于 GPL-3.0-or-later 许可发布