成功地将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() 

我得到了hasStoredtrue ,但readVal总是nil 。 我调查了我的function,我看到我总是得到错误-50作为阅读器function的状态代码 (请参阅我的函数中的评论)。

为什么? 为什么我不能读取我存储在钥匙串中的值(我不确定它是否真的存储了,但是我得到了status == noErr总是在storeString(value:)函数中callbacktrue

你的代码有一个错字:

 query[kSecMatchLimit as String] = kSecMatchLimit // ^~~~~~~~~~~~~~ 

kSecMatchLimit是关键而不是有效的值。 期望值应该是CFNumberkSecMatchLimitOnekSecMatchLimitAll 。 如果您希望返回单个项目,请使用kSecMatchLimitOne 。 另请参阅search属性键和值 。