【发布时间】:2017-06-03 15:25:54
【问题描述】:
我正在尝试将我从 this answer 获得的用于生成 CSR 的代码从 Swift 2 升级到 Swift 3。
我已经升级了大部分代码,但是原始答案的 Utility 块中的以下代码失败并出现错误:
“init”不可用:使用“withMemoryRebound(to:capacity:_)”临时将内存视为另一种布局兼容类型。
错误发生在以下行:
let status: OSStatus = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as NSDictionary, UnsafeMutablePointer($0)) }
func loadKeySecKeyFromKeyChain(key: String) -> SecKey{
let query: Dictionary<String, AnyObject> = [
String(kSecAttrKeyType): kSecAttrKeyTypeRSA,
String(kSecAttrKeySizeInBits): KEY_SIZE as AnyObject,
String(kSecClass): kSecClassKey,
String(kSecAttrApplicationTag): key as AnyObject,
kSecReturnRef as String : kCFBooleanTrue ]
var dataTypeRef: Unmanaged<AnyObject>? = nil
var resultData: SecKey? = nil
let status: OSStatus = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as NSDictionary, UnsafeMutablePointer($0)) }
NSLog("SecItemCopyMatching: " + status.description)
if status == errSecSuccess {
NSLog("private or public debug description is: " + dataTypeRef.debugDescription)
resultData = (dataTypeRef!.takeRetainedValue() as! SecKey)
NSLog("SecItemCopyMatching returns SecKey: " + resultData.debugDescription)
return resultData!
} else {
return resultData!
}
}
我在这个问题上卡了一整天,有什么建议可以解决这个错误吗?
【问题讨论】:
-
@pedrofb 你能帮忙解答这个问题吗?
-
This 帮助我更好地理解了 Swift3 中的指针用法。
-
是的。其实我已经看过这个帖子了。很棒,但我仍然无法弄清楚这里发生了什么
-
好吧。该答案将 PrivateKey 作为数据检索。我尝试将其转换为 SecKey,但在生成 CSR 时失败。