ios - 如何从 Swift 中的 SecItemCopyMatching 返回多个匹配项

标签 ios swift keychain

我想在我的 iOS 应用程序中支持多个帐户,并且我正在使用 KeyChain 来存储凭据。我正在存储具有相同类 (kSecClassGenericPassword) 和属性 (kSecAttrService) 但具有不同用户名 (kSecAttrAccount) 的帐户。这工作正常,我可以使用不同的用户名登录。

我现在想检索这些用户名,这就是我遇到问题的地方。 我将查询定义并执行为:

let objects = [kSecClassGenericPassword, "foo", kCFBooleanTrue,kSecMatchLimitAll]
let keys = [kSecClass,kSecAttrService kSecReturnAttributes,kSecMatchLimit]
let query = NSDictionary(objects: objects, forKeys: keys)
var dataTypeRef : Unmanaged<AnyObject>?
let status = SecItemCopyMatching(query, &dataTypeRef)

但只返回一项。我的 dataTypeRef 是一个 CFDictionary 而我希望它是一个 CFArray

根据Apple Docs on SecItemCopyMatching

By default, this function returns only the first match found. To obtain more than one matching item at a time, specify the search key kSecMatchLimit with a value greater than 1. The result will be an object of type CFArrayRef containing up to that number of matching items.

正如您从我的代码中看到的那样,我已经完成了此操作,但没有成功。

谁能指出我正确的方向?

最佳答案

根据Apple Doc on SecItemCopyMatching这个函数的第二个参数是 UnsafeMutablePointer<AnyObject?> .

请注意,这是来自最新文档的信息。

let keychainQuery: [NSObject: AnyObject] =  [
    kSecClass : kSecClassInternetPassword,
    kSecReturnAttributes : kCFBooleanTrue,
    kSecMatchLimit : kSecMatchLimitAll
]

var result: AnyObject?
let status = withUnsafeMutablePointer(&result) {
    SecItemCopyMatching(keychainQuery, UnsafeMutablePointer($0))
}

if status == noErr {
    print(result)
}

我目前正在一个项目中使用它并且效果很好。

希望对你有帮助。

关于ios - 如何从 Swift 中的 SecItemCopyMatching 返回多个匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26496987/

相关文章:

ios - 显示一个已经在 Navigation Stack 上的 View Controller

objective-c - JSON Payload 似乎没有发送

ios - 快速创建选择框

ios - 导航 Controller 从第二次转换开始显示

iOS 钥匙串(keychain)访问后台线程和应用程序崩溃

html - 我可以在 IOS 5 的一个 UIWebView 中有两种不同的样式吗

ios - 侧边菜单 BarPosition 错误 iOS 9

ios - 如何从 cellForItemAtIndexPath 设置 UICollectionViewCell 高度?

macos - 如何在Mail.app中运行的applescript中使用钥匙串(keychain)中的密码?

iOS:如何在应用程序中存储用户名/密码?