从钥匙串中检索SecKey

我试图升级从生成CSR的这个答案 ,从Swift 2到Swift 3的代码。

我已经升级了大部分代码,但原始答案的实用程序块中的以下代码失败,并显示错误消息:

'init'不可用:使用'withMemoryRebound(to:capacity:_)'来临时查看另一个布局兼容types的内存。

该行发生错误:

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

我一直坚持了这一整天,有没有对如何解决这个错误的build议?

只要使用SecItemCopyMatching 。 我能够将其转换为Swift 3并成功生成CSR。

 // Finds the SecKeyRef corresponding to the parameter key and returns it 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 var result: AnyObject? let status = SecItemCopyMatching(query as CFDictionary, &result) if status == errSecSuccess { resultData = result as! SecKey return resultData! } else { return resultData! } }