2015-04-29 8 views
6

Mam pewne problemy z konwersją kodu, który znalazłem w dokumentacji Apple na szybki kod. Aby być precyzyjnym to rzeczy o TSL oraz certyfikatów ...Swift i SecTrust

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

Jest to oryginalny kod w Objective-C

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

A to moja próba ...

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

ERROR 1:

'Int' is not convertible to 'SecTrustResultType' 

ERROR 2:

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

Teraz widzę, że SecTrustResultType jest UInt32 i kSecTrustResultInvalid jest Int ... ale ten nagłówek jest określony przez Apple, więc przypuszczam, że powinno być poprawne: P

typealias SecTrustResultType = UInt32 
var kSecTrustResultInvalid: Int { get } 

O drugim błędem ja naprawdę nie wiem, jak zarządzać go od funkcji SecTrustEvaluate zwraca OSStatus (to jest aliasem dla UInt32) i errSecSuccess jest OSStatus też.

Jestem naprawdę zdezorientowany. Czy masz jakieś sugestie, aby te rzeczy działały !?

+1

Dla Państwa błąd 1, możesz przekonwertować Int na UInt32: 'var secresult: SecTrustResultType = UInt32 (kSecTrus tResultInvalid) ' – Moritz

Odpowiedz

4

Sam wpadłem na ten problem, a dokumentacja nagłówka jest nieco myląca, szczególnie, że stałe są zdefiniowane jako Int s, a SecTrustResultType jest zdefiniowane jako UInt32.

Ale dobrą wiadomością, rozwiązanie jest dość proste tylko init, SecTrustResultType z 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

pozostaje taka sama w Swift 3.0:

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