44

キーチェーンに保存されているすべてのアイテムをプログラムで (アプリ内から) 取得する最も簡単な方法は何ですか?

おそらく SecItemCopyMatching() と関係がありますが、その関数のドキュメントはあまり明確ではありません (Web 上で適切なサンプルを見つけることができませんでした)。

4

6 に答える 6

13

@Cosmin の Swift 3 answer に対するSwift 4の更新。

open func getAllKeyChainItemsOfClass(_ secClass: String) -> [String:String] {
    let query: [String: Any] = [
        kSecClass as String : secClass,
        kSecReturnData as String  : kCFBooleanTrue,
        kSecReturnAttributes as String : kCFBooleanTrue,
        kSecReturnRef as String : kCFBooleanTrue,
        kSecMatchLimit as String: kSecMatchLimitAll
    ]
                
    var result: AnyObject?
                
    let lastResultCode = withUnsafeMutablePointer(to: &result) {
        SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
    }
                
    var values = [String:String]()
    if lastResultCode == noErr {
        let array = result as? Array<Dictionary<String, Any>>
                    
        for item in array! {
            if let key = item[kSecAttrAccount as String] as? String,
               let value = item[kSecValueData as String] as? Data {
                   values[key] = String(data: value, encoding:.utf8)
             }
         }
    }
                
    return values
}
于 2018-08-18T06:45:30.553 に答える