kSecAttrAccessControl对应的值?

Corresponding value of kSecAttrAccessControl?

kSecAttrAccessControl对应值的类型是什么?从文档中,它表示该值将是 SecAccessControlCreateWithFlags(_:_:_:_:) 的 return 值,可用于为 SecItemAdd 等创建查询

然而,在Swift2中,这似乎不起作用。当我尝试添加项目时出现 errSecParam 错误。据了解,在Swift1中,可以使用.takeRetainedValu()来解决。但是,在 Swift 中似乎并非如此 2.

这是伪代码:

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

我认为这可能是您的问题。 kSecAttrAccessiblekSecAttrAccessControl 似乎是相互排斥的,这意味着两者不能共存。

尝试删除一个并使用另一个(您的选择,因为我对两者的了解不足以提供建议)。

Apple documentation

希望对您有所帮助!