我想在我的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 类型的对象,其中包含匹配项目的数量。
从我的代码中可以看出,我已经做到了这一点,但没有运气。
有人能指出我正确的方向吗?
答案 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)
}
我目前正在使用这个项目并且效果很好。
希望能帮助你。