Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift钥匙链状态-50_Swift_Keychain - Fatal编程技术网

Swift钥匙链状态-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

我试图使用swift中的钥匙链来保存密码,但当我尝试调用save方法时,它返回的状态为-50

以下是我的功能:

 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
。在保存之前,请先尝试转换您的
字符串