2015-04-29 7 views
6

Sto riscontrando alcuni problemi nel tentativo di convertire il codice che ho trovato nella documentazione di Apple in un codice rapido. Per la precisione si tratta di roba su TSL e certificati ...Swift e SecTrust

https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html

Questo è il codice originale in Objective-C

SecTrustResultType secresult = kSecTrustResultInvalid; 
if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) 
    return; 
} 

E questo è il mio tentativo ...

var secresult:SecTrustResultType = kSecTrustResultInvalid // ERROR 1 
if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) { // ERROR 2 
    return; 
} 

ERRORE 1 è:

'Int' is not convertible to 'SecTrustResultType' 

ERRORE 2 è:

Could not find an overload for '!=' that accepts the supplied arguments 

Ora, vedo che è un SecTrustResultTypeUInt32 e kSecTrustResultInvalid è un Int ... ma questa intestazione è definito da Apple quindi suppongo che dovrebbe essere corretto: P

typealias SecTrustResultType = UInt32 
var kSecTrustResultInvalid: Int { get } 

Circa il secondo errore io davvero non so come gestirla poiché la funzione SecTrustEvaluate restituisce un OSStatus (che è un alias per UInt32) e errSecSuccess è un OSStatus troppo.

Sono davvero confuso. Hai qualche suggerimento per far funzionare questa roba !?

+1

Per la vostra errore 1, è possibile convertire l'Int in un UInt32: 'var secresult: SecTrustResultType = UInt32 (kSecTrus tResultInvalid) ' – Moritz

risposta

4

mi sono imbattuto in questo problema me stesso e la documentazione di intestazione sono un po 'di confusione soprattutto perché le costanti sono definiti come Int s e SecTrustResultType è definito come un UInt32.

Ma una buona notizia, la soluzione è piuttosto semplice, basta init SecTrustResultType con kSecTrustResultInvalid:

var secresult = SecTrustResultType(kSecTrustResultInvalid) 
if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ 
     return; 
} 
1

Swift 2,3

var secresult = SecTrustResultType.Invalid 
if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ 
     return; 
} 
0

rimane lo stesso a Swift 3.0:

var secresult = SecTrustResultType.Invalid 
if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ 
    return; 
}