kSecAttrAccessControl对应值的类型是什么?从文档中可以看出,该值将是SecAccessControlCreateWithFlags(_:_:_:_:)的返回值,可用于为SecItemAdd等创建查询。
然而,在Swift 2中,这似乎不起作用。当我尝试添加项目时,我收到errSecParam错误。据了解,在Swift 1中,您可以使用.takeRetainedValu()来解决这个问题。但是,在Swift 2中似乎并非如此。
这是Psuedo代码:
func addItem() -> String {
// Build a query for adding a keychain item.
let account: String! = "testAccount"
let service: String! = "testService"
let accessible: String! = kSecAttrAccessibleWhenUnlocked as String
let data: NSData! = "test data".dataUsingEncoding(NSUTF8StringEncoding)
let acl: SecAccessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenUnlocked, .UserPresence, nil)!
let query = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : account,
kSecAttrService as String : service,
kSecAttrAccessible as String: accessible,
kSecAttrAccessControl as String : acl, //errSecParam because of acl!
kSecValueData as String : data
] as NSDictionary
status = SecItemAdd(query, nil)
if status != errSecSuccess {
print("[addItem::SecItemAdd] \(osstatusToHumanReadable(status))")
}
return osstatusToHumanReadable(status)
}
答案 0 :(得分:0)
我认为这可能是你的问题。 kSecAttrAccessible 和 kSecAttrAccessControl 似乎是互斥的,这意味着两者都不能共存。
尝试删除一个并使用另一个(您的选择,因为我对这两者的了解不足以提供建议)。
希望这有帮助!