secItemAdd在swift中保持返回-50错误

use*_*393 4 keychain ios

尝试在安全链中添加项目时,请继续获取-50.

    var query = [String:AnyObject]()
    query[kSecClass as String] = kSecClassGenericPassword
    query[kSecAttrAccount as String] = "a"
    query[kSecValueData as String] = "b"
    let result = SecItemAdd(query as CFDictionary, nil);
Run Code Online (Sandbox Code Playgroud)

结果是-50.无法弄清楚为什么,需要帮助..在此先感谢.

Tim*_*Tim 9

我相信kSecValueData密钥的值需要是NSData,而不是String或NSString.尝试将字符串编码为数据(例如使用UTF-8编码).未经测试的片段:

query[kSecValueData as String] = "b".dataUsingEncoding(NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

为了将来参考,错误代码-50对应于errSecParam,SecBase.h头文件的含义为:"传递给函数的一个或多个参数无效." 如果再次看到此错误,请尝试使用查询字典更改传入的值.

  • 在 swift 4 中: `"b".data(使用:String.Encoding.utf8)` (2认同)

Max*_*hun 7

略微更新了 Swift 5 版本的“添加到/从钥匙串中删除”功能:

@discardableResult
func addToKeychain(_ value: Data, tag: Data) -> Bool {
    let attributes: [String: Any] = [
        String(kSecClass): kSecClassKey,
        String(kSecAttrApplicationTag): tag,
        String(kSecValueData): value
    ]

    var result: CFTypeRef? = nil
    let status = SecItemAdd(attributes as CFDictionary, &result)
    if status == errSecSuccess {
        print("Successfully added to keychain.")
    } else {
        if let error: String = SecCopyErrorMessageString(status, nil) as String? {
            print(error)
        }

        return false
    }

    return true
}

@discardableResult
func removeFromKeychain(_ value: Data, tag: Data) -> Bool {
    let attributes: [String: Any] = [
        String(kSecClass): kSecClassKey,
        String(kSecAttrApplicationTag): tag,
        String(kSecValueData): value
    ]

    let status = SecItemDelete(attributes as CFDictionary)
    if status == errSecSuccess {
        print("Successfully removed from keychain.")
    } else {
        if let error: String = SecCopyErrorMessageString(status, nil) as String? {
            print(error)
        }

        return false
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)

可以像这样使用:

let value: Data = "key".data(using: .utf8)!
let tag: Data = "com.test.key".data(using: .utf8)!

removeFromKeychain(value, tag: tag)
addToKeychain(value, tag: tag)
Run Code Online (Sandbox Code Playgroud)