2014-10-21 96 views
1

我想在我的iOS應用程序中支持多個帳戶,並使用KeyChain存儲憑據。我使用相同的類(kSecClassGenericPassword)和屬性(kSecAttrService)存儲帳戶,但使用不同的用戶名(kSecAttrAccount)。這工作正常,我可以用不同的用戶名登錄。如何從Swift中的SecItemCopyMatching返回多個匹配

我現在想要檢索這些用戶名,這是我遇到問題的地方。 我定義和執行我的查詢爲:

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

請勿使用'NSDictionary(object:keys:)'。只需使用[[kSecClass:kSecClassGenericPassword,kSecAttrServer:「foo」,...]' – jtbandes 2014-10-22 00:47:07

回答

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) 
} 

我目前使用這個是在一個項目中,它的工程很好。

希望能幫助你。