Как исправить ошибку «Не удается преобразовать значение типа« UnsafeMutablePointer »»? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь сгенерировать и получить информацию о паре ключей для приложения Swift iOS, и у меня возникают проблемы при установке UnsafeMutablePointer со следующей ошибкой:

Невозможно преобразовать значение типа 'UnsafeMutablePointer <_> 'к ожидаемому типу аргумента' UnsafeMutablePointer ? (он же необязательный > ')

Я пытаюсь использовать следующее обсуждение StackOverflow, чтобы заставить его работать: Создать CSR в iOS Библиотеке?

Мой вопрос это как явно установить значение для исправления этой ошибки?

Ниже приведен следующий код, который я пытаюсь использовать:

//Locates the SecKeyRef to the key passed in and returns secKeyRef

func readSecKeyRefFromKeychain(searchKey: String) -> SecKey
{
    let keyQuery: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType):kSecAttrKeyTypeRSA,
        String(kSecAttrKeySizeInBits):KEY_SIZE as AnyObject,
        String(kSecClass):kSecClassKey,
        String(kSecAttrApplicationTag):searchKey as AnyObject,
        kSecReturnRef as String : kCFBooleanTrue
    ]

    var dataTypeReference: Unmanaged<AnyObject>? = nil
    var dataResult: SecKey? = nil

    let status: OSStatus = withUnsafeMutablePointer(to:&dataTypeReference)
    {
        SecItemCopyMatching(keyQuery as NSDictionary, UnsafeMutablePointer($0))
    }
    NSLog("readSecKeyRefFromKeychain: SecItemCopyMatching: " + status.description)

    if status == errSecSuccess{
        NSLog("key debug description is: " + dataTypeReference.debugDescription)
        dataResult = (dataTypeReference!.takeRetainedValue() as! SecKey)
        NSLog("public or private secKeyRef is: " + dataResult.debugDescription)
        return dataResult!
    }else{
        return dataResult!
    }
}

1 Ответ

0 голосов
/ 21 апреля 2020

Это?

//Locates the SecKeyRef to the key passed in and returns secKeyRef

func readSecKeyRefFromKeychain(searchKey: String) -> SecKey {
    let keyQuery: Dictionary<String, AnyObject> = [
        String(kSecAttrKeyType):kSecAttrKeyTypeRSA,
        String(kSecAttrKeySizeInBits):KEY_SIZE as AnyObject,
        String(kSecClass):kSecClassKey,
        String(kSecAttrApplicationTag):searchKey as AnyObject,
        kSecReturnRef as String : kCFBooleanTrue
    ]

    var dataTypeReference: Unmanaged<AnyObject>? = nil
    var dataResult: SecKey? = nil

    let status: OSStatus = withUnsafeMutablePointer(to:&dataTypeReference) {
        SecItemCopyMatching(query as NSDictionary, ($0 as CFTypeRef) as? UnsafeMutablePointer<CFTypeRef?>)
    }

    NSLog("readSecKeyRefFromKeychain: SecItemCopyMatching: " + status.description)

    if status == errSecSuccess {
        NSLog("key debug description is: " + dataTypeReference.debugDescription)
        dataResult = (dataTypeReference!.takeRetainedValue() as! SecKey)
        NSLog("public or private secKeyRef is: " + dataResult.debugDescription)
        return dataResult!
    } else {
        return dataResult!
    }
}
...