在钥匙串中查找密码
要构造查询,我们需要将其表示为 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
。这是可能性。