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

时间:2014-10-21 21:51:34

标签: 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

  

默认情况下,此函数仅返回找到的第一个匹配项。要一次获得多个匹配项,请指定搜索键 kSecMatchLimit ,其值大于1.结果将是 CFArrayRef 类型的对象,其中包含匹配项目的数量。

从我的代码中可以看出,我已经做到了这一点,但没有运气。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

相对于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)
}

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

希望能帮助你。