在鑰匙串中查詢密碼

要構造查詢,我們需要將其表示為 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是可能性。