Swift和SecTrust
我遇到一些麻烦,试图将我在Apple文档中find的代码转换为swift代码。 准确地说,这是关于TSL和证书的东西…
https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html
这是Objective-C中的原始代码
SecTrustResultType secresult = kSecTrustResultInvalid; if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) return; }
这是我的尝试…
var secresult:SecTrustResultType = kSecTrustResultInvalid // ERROR 1 if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) { // ERROR 2 return; }
错误1是:
'Int' is not convertible to 'SecTrustResultType'
错误2是:
Could not find an overload for '!=' that accepts the supplied arguments
现在,我看到SecTrustResultType
是一个UInt32
而kSecTrustResultInvalid
是一个Int
…但是这个头文件是由Apple定义的,所以我认为它应该是正确的:P
typealias SecTrustResultType = UInt32 var kSecTrustResultInvalid: Int { get }
关于第二个错误我真的不知道如何pipe理它,因为函数SecTrustEvaluate
返回一个OSStatus
(这是UInt32
的别名), errSecSuccess
也是一个OSStatus
。
我很困惑。 你有任何build议,使这个东西工作!
我自己遇到这个问题,头文件有点混乱,特别是因为常量被定义为Int
和SecTrustResultType被定义为UInt32
。
但是好消息是,解决方法相当简单,只需使用kSecTrustResultInvalid
初始化kSecTrustResultInvalid
:
var secresult = SecTrustResultType(kSecTrustResultInvalid) if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ return; }
Swift 2.3
var secresult = SecTrustResultType.Invalid if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ return; }
在Swift 3.0中仍然是一样的:
var secresult = SecTrustResultType.Invalid if (SecTrustEvaluate(serverTrust, &secresult) != errSecSuccess){ return; }