【发布时间】:2020-11-01 09:40:56
【问题描述】:
我的应用面临一个奇怪的钥匙串行为:有时它返回-25300 状态而不是肯定存在的凭据。结果:已登录的用户随机变为“退出”。
应用重启没有帮助,只有新用户授权。
似乎物品似乎从钥匙串中消失了。
在仔细查看了从钥匙串中保存和读取数据的代码并将其与 Apple 的示例进行比较后,我注意到我们在保存 kSecClassGenericPassword 的项目时不使用 kSecAttrService 属性。
这里有一些代码sn-ps:
func saveData(_ data: Data, for key: String) -> OSStatus {
let query: [CFString : Any] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecValueData: data,
kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
return SecItemAdd(query as CFDictionary, nil)
}
func readData(for key: String) -> String? {
let query: [CFString: Any] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecReturnData: kCFBooleanTrue as Any,
kSecMatchLimit: kSecMatchLimitOne
]
var result: AnyObject?
_ = withUnsafeMutablePointer(to: &result) {
SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
return (result as? Data).flatMap {
String(data: $0, encoding: .utf8)
}
}
那么,在保存kSecClassGenericPassword 项时缺少kSecAttrService 可能是钥匙串项由于某种原因变得无法访问的原因,还是有其他原因?
谢谢
【问题讨论】: