从钥匙串中检索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! } }