使用SecItemAdd保存数据至Keychain时出错,求错误排查方法
Keychain保存错误排查与错误信息获取
获取可读的错误信息
SecItemAdd返回的OSStatus状态码直接对应错误类型,你可以用SecCopyErrorMessageString把状态码转换成人类可读的描述,替换当前的错误打印逻辑:
let status = SecItemAdd(attributes as CFDictionary, nil) if status == noErr { print("\(#function) 😀 user saved successfully in keychain") } else { if let errorMessage = SecCopyErrorMessageString(status, nil) as String? { print("\(#function) ⚠️ 保存失败: \(errorMessage)") } else { print("\(#function) ⚠️ 保存失败,未知错误,状态码: \(status)") } }
代码里的潜在问题
- 缺少必要属性:对于
kSecClassGenericPassword类型的条目,kSecAttrAccount+kSecAttrService是唯一标识条目的必要组合,缺少kSecAttrService可能导致保存失败,建议补充:
let attributes: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: "johnDoe", kSecAttrService as String: "com.yourapp.keychain.service", // 替换为你的App唯一标识 kSecValueData as String: encoded, ]
- 编码错误被吞掉:
try? self.encoder.encode(user)会忽略编码失败的情况,导致你无法排查数据编码层面的问题,建议换成do-catch捕获错误:
do { let encoded = try self.encoder.encode(user) // Keychain保存逻辑写在这里 } catch { print("\(#function) ⚠️ 用户数据编码失败: \(error.localizedDescription)") completion(false) return }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

