Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.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
Ios 在swift5中更新和删除密钥链时出现问题_Ios_Swift_Keychain_Swift5 - Fatal编程技术网

Ios 在swift5中更新和删除密钥链时出现问题

Ios 在swift5中更新和删除密钥链时出现问题,ios,swift,keychain,swift5,Ios,Swift,Keychain,Swift5,我在更新和删除密钥链时遇到问题 public func clearKeychain(username: String) throws -> Any?{ let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: username ] let status = SecItemDelete(qu

我在更新和删除密钥链时遇到问题

public func clearKeychain(username: String) throws -> Any?{
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: username
    ]
    let status = SecItemDelete(query as CFDictionary)

    if status != errSecSuccess {
        throw KeychainError.unhandledError(status: status)
    }
    print("Clear Keychain")
    return status
}

public func updateKeychain(username: String, password: String) throws -> Any?{
    let credentials = Credentials.init(username: username, password: password)
    let data = credentials.password.data(using: .utf8)!

    // store password as data and if you want to store username
    let query: [String: Any] = [kSecClass as String:  kSecClassGenericPassword,
                                kSecAttrAccount as String: username,
                                kSecValueData as String: data]
    let fields: [String: Any] = [
        kSecAttrAccount as String: username,
        kSecValueData as String: data
    ]
    let status = SecItemUpdate(query as CFDictionary, fields as CFDictionary)
    guard status == errSecSuccess else {
        throw KeychainError.unhandledError(status: status) }
    print("Updated Password")
    return status
}
用法:

let _ = (try? keychain.clearKeychain(username: "KeychainUser")) as Any?
let _ = (try? keychain.updateKeychain(username: "KeychainUser", password: "123456789")) as Any?

无法删除或更新密钥链。我在创建和获取钥匙链的价值方面没有问题,但在更新或删除钥匙链时遇到了问题。没有显示错误。状态返回零。

要更新和删除您的项目,您需要搜索特定类型的数据。所以您不需要在查询中传递数据。只需更新您的查询,如下所示将解决更新数据的问题

let query: [String: Any] = [kSecClass as String:  kSecClassGenericPassword]
默认情况下,keychain services删除所有匹配的keychain项 搜索参数。如果要删除要删除的特定项目 已经有对的引用或持久引用,请将其添加到 搜索字典作为kSecMatchItemList键的值。在这个 这样,您就可以将删除限制为只删除指定的项


没有显示错误。当然不是因为您忽略了错误。并且
状态
值不是
任何
(甚至不是
任何?
),
状态
是一个整数,如果它不是零,则表示错误。它可以通过
SecCopyErrorMessageString
显示为可读字符串。无论如何,这两种方法的返回值都是毫无意义的。很高兴能帮助您。