Swift钥匙链状态-50
我试图使用swift中的钥匙链来保存密码,但当我尝试调用save方法时,它返回的状态为-50 以下是我的功能:Swift钥匙链状态-50,swift,keychain,Swift,Keychain,我试图使用swift中的钥匙链来保存密码,但当我尝试调用save方法时,它返回的状态为-50 以下是我的功能: class func save(key: String, data: String) -> OSStatus { let query = [ kSecClass as String : kSecClassGenericPassword as String, kSecAttrAccount as Stri
class func save(key: String, data: String) -> OSStatus {
let query = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : key,
kSecValueData as String : data ]
SecItemDelete(query as CFDictionary)
return SecItemAdd(query as CFDictionary, nil)
}
class func load(key: String) -> String? {
let query = [
kSecClass as String : kSecClassGenericPassword,
kSecAttrAccount as String : key,
kSecReturnData as String : kCFBooleanTrue!,
kSecMatchLimit as String : kSecMatchLimitOne ] as [String : Any]
var dataTypeRef: AnyObject? = nil
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == noErr {
return dataTypeRef as! String?
} else {
return nil
}
}
let status = KeyChain.save(key: "Ufde", data: "Eli")
print("status: ", status)
let receivedData = KeyChain.load(key: "Ufde")
print(receivedData)
然后我尝试调用这些函数:
class func save(key: String, data: String) -> OSStatus {
let query = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : key,
kSecValueData as String : data ]
SecItemDelete(query as CFDictionary)
return SecItemAdd(query as CFDictionary, nil)
}
class func load(key: String) -> String? {
let query = [
kSecClass as String : kSecClassGenericPassword,
kSecAttrAccount as String : key,
kSecReturnData as String : kCFBooleanTrue!,
kSecMatchLimit as String : kSecMatchLimitOne ] as [String : Any]
var dataTypeRef: AnyObject? = nil
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == noErr {
return dataTypeRef as! String?
} else {
return nil
}
}
let status = KeyChain.save(key: "Ufde", data: "Eli")
print("status: ", status)
let receivedData = KeyChain.load(key: "Ufde")
print(receivedData)
这是我第一次尝试使用钥匙链,因此,如果这里有明显的错误,我很抱歉/您将密码存储为钥匙链中的字符串。将密码字符串转换为数据
class func save(key: String, password: String) -> OSStatus {
let data = password.data(using: .utf8)!
let query = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : key,
kSecValueData as String : data]
SecItemDelete(query as CFDictionary)
return SecItemAdd(query as CFDictionary, nil)
}
我不太确定,但你确定它是
-5
而不是-50
?我有预感SecItemDelete会让你失败,而且据我所知,通用密码的kSecAttrAccount
不是唯一的。我注意到的另一件事是,您在保存时说kSecClassGenericPassword as String
,忽略as String
。最后一点我想指出的是,kSecValueData
需要Data
,或者就此而言CFData
。在保存之前,请先尝试转换您的字符串