gpt4 book ai didi

macos - 从 Swift 使用 SecKeychainCreate

转载 作者:搜寻专家 更新时间:2023-11-01 06:22:14 26 4
gpt4 key购买 nike

我正在编写一个应该维护自定义钥匙串(keychain)的 OS X 应用程序,我正在尝试使用安全框架的 API 来创建钥匙串(keychain),但是,我似乎无法在 Swift 下编译它。

这是我所拥有的,假设 path 包含一个可能存在的钥匙串(keychain)的路径:

let pathName = (path as NSString).UTF8String
var keychain: Unmanaged<SecKeychain>?

var status = withUnsafeMutablePointer(&keychain) { pointer in
SecKeychainOpen(pathName, pointer)
}

if status != errSecSuccess {
status = withUnsafeMutablePointer(&keychain) { pointer in
SecKeychainCreate(pathName, UInt32(0), nil, false, nil, pointer)
}
}

编译器提示 SecKeychainCreate 调用中的类型,但是,我无法理解我做错了什么。

Cannot invoke 'withUnsafeMutablePointer' with an argument list of type '(inout Unmanaged<SecKeychain>?, (_) -> _)'

如果我稍微修改第二个闭包,我会得到这个编译器错误:

Cannot invoke 'SecKeychainCreate' with an argument list of type '(UnsafePointer<Int8>, UInt32, nil, Bool, nil, (UnsafeMutablePointer<Unmanaged<SecKeychain>?>))'

我感谢所有建议。

最佳答案

SecKeychainCreate()promptUser 参数具有以下类型Boolean,它是“Mac OS 历史类型”和 UInt8 的别名,所以它不同于 Swift 1.2 中的 Swift Bool。(比较 Type 'Boolean' does not conform to protocol 'BooleanType' 以了解类似问题。) 这意味着你必须传递 Boolean(0) 而不是 false:

SecKeychainCreate(pathName, UInt32(0), nil, Boolean(0), nil, pointer)

补充说明:

  • withUnsafeMutablePointer() 不需要,可以通过&keychain到钥匙串(keychain)功能。
  • (path as NSString).UTF8String 不是必需的,你可以传递一个 Swift字符串到需要 const char * 参数的 C 函数,比较 String value to UnsafePointer<UInt8> function parameter behavior .
  • 只允许将 nil 作为密码传递给 SecKeychainCreate()如果 promptUserTRUE,否则会导致“参数错误(-50)”。
  • SecKeychainOpen() 即使钥匙串(keychain)文件没有成功存在。根据文档,您必须检查SecKeychainGetStatus()。或者,您可以尝试创建首先是钥匙串(keychain)文件,例如 Open Local Items Keychain? .

一起:

let path = "/path/to/my.keychain"
var keychain: Unmanaged<SecKeychain>?

var status = SecKeychainCreate(path, 0, "", Boolean(0), nil, &keychain)
if status == OSStatus(errSecDuplicateKeychain) {
status = SecKeychainOpen(path, &keychain)
}

Swift 2/Xcode 7 beta 5 Mac 类型 Boolean 被映射将 Swift 作为 Bool, key 链函数不再返回非托管对象:

let path = "/path/to/my.keychain"
var keychain: SecKeychain?

var status = SecKeychainCreate(path, 0, "", false, nil, &keychain)
if status == OSStatus(errSecDuplicateKeychain) {
status = SecKeychainOpen(path, &keychain)
}

关于macos - 从 Swift 使用 SecKeychainCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31896730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com