成功地将string值存储到keychian中,但始终未能读出
我正在用XCode8 + Swift3开发iOS项目。
我创build了以下两个函数来将string存储到钥匙串中并从钥匙串中读回:
var query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: "my service", kSecAttrAccount as String: "my-key" ] func storeString(value: String) -> Bool { if let data = value.data(using: .utf8) { // delete data if exist SecItemDelete(query as CFDictionary) // add value to query query[kSecValueData as String] = data // add to keychain let status = SecItemAdd(query as CFDictionary, nil) return status == noErr } return false } func readString() -> String? { // update query query[kSecReturnData as String] = kCFBooleanTrue query[kSecMatchLimit as String] = kSecMatchLimit var result: AnyObject? // fetch items from keychain let status: OSStatus = withUnsafeMutablePointer(to: &result) { SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) } // I always get error -50 here if status == noErr { if let resultData = result as? Data { if let strVal = String(data: resultData, encoding: .utf8) { return strVal } } } return nil }
我调用的function:
boolean hasStored = storeString(value: "John") let readVal = readString()
我得到了hasStored
是true
,但readVal
总是nil
。 我调查了我的function,我看到我总是得到错误-50作为阅读器function的状态代码 (请参阅我的函数中的评论)。
为什么? 为什么我不能读取我存储在钥匙串中的值(我不确定它是否真的存储了,但是我得到了status == noErr
总是在storeString(value:)
函数中callbacktrue
)
你的代码有一个错字:
query[kSecMatchLimit as String] = kSecMatchLimit // ^~~~~~~~~~~~~~
kSecMatchLimit
是关键而不是有效的值。 期望值应该是CFNumber
或kSecMatchLimitOne
或kSecMatchLimitAll
。 如果您希望返回单个项目,请使用kSecMatchLimitOne
。 另请参阅search属性键和值 。