在 swift5 中更新和删除钥匙串时出现问题



我在更新和删除钥匙串时遇到问题。

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?

无法删除或更新钥匙串。我在创建和获取钥匙串的值时没有问题,但在更新或删除时遇到问题。不显示任何错误。状态返回 nil。

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

let query: [String: Any] = [kSecClass as String:  kSecClassGenericPassword]

默认情况下,钥匙串服务会删除所有匹配的钥匙串项目 搜索参数。如果要删除特定项目 已经有引用或持久引用,将其添加到 搜索字典作为kSecMatchItemList键的值。在此 方式,您将删除限制为仅指定项目。

最新更新