kSecAttrAccessControl的对应值?

时间:2016-02-12 04:13:19

标签: ios swift2 keychain

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

1 个答案:

答案 0 :(得分:0)

我认为这可能是你的问题。 kSecAttrAccessible kSecAttrAccessControl 似乎是互斥的,这意味着两者都不能共存。

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

Apple documentation

希望这有帮助!