在钥匙串中查找密码

要构造查询,我们需要将其表示为 CFDictionary。你也可以在 Objective-C 中使用 NSDictionary 或在 Swift 中使用 Dictionary 并使用 CFDictionary

我们需要一个类密钥:

迅速

var dict = [String : AnyObject]()
dict[kSecClass as String] = kSecClassGenericPassword

接下来,我们可以指定属性来缩小搜索范围:

迅速

// Label
dict[kSecAttrLabel as String] = "com.me.myapp.myaccountpassword" as CFString
// Username
dict[kSecAttrAccount as String] = "My Name" as CFString
// Service name
dict[kSecAttrService as String] = "MyService" as CFString

我们还可以指定此处描述的特殊搜索修饰键。

最后,我们需要说明我们的数据是如何返回的。下面,我们将要求只将私有密码作为 CFData 对象返回:

迅速

dict[kSecReturnData as String] = kCFBooleanTrue

现在,让我们搜索:

迅速

var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
    SecItemCopyMatching(dict as CFDictionary, UnsafeMutablePointer($0))
}
// Don't keep this in memory for long!!
let password = String(data: queryResult as! Data, encoding: .utf8)!

在这里,SecItemCopyMatching 接收一个查询字典和一个指向你想要结果的位置的指针。它返回带有结果代码的 OSStatus是可能性。