[英]ViewDidLoad() method called every time in xCode 9.4 and iOS 11
[英]iOS canAuthenticateAgainstProtectionSpace method not called every time
我正在嘗試執行SSL證書驗證並已實現委托canAuthenticateAgainstProtectionSpace
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace*)protectionSpace
{
OSStatus status = SecTrustEvaluate(protectionSpace.serverTrust, &trustResult);
if(status == errSecSuccess)
{
}
else
{
}
}
但是,我注意到第一次為給定的URL調用此委托,但不會針對同一URL的后續嘗試進行調用。 我認為這與緩存的響應有關,所以我創建了NSURLRequest,如下所示:
NSURLRequest *request = [[NSURLRequest alloc]
initWithURL: [NSURL URLWithString:_urlString]
cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval: 10
];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
這也無濟於事。 任何想法,我怎么能得到canAuthenticateAgainstProtectionSpace方法每次都能得到調用?
上面的答案並沒有解決實際問題。 這里的實際問題是,只有在應用程序打開時第一次為該URL建立連接時才會顯示身份驗證質詢。
正如解釋這里
TLS會話是處理器密集型的,Apple不希望您在每次與該URL建立連接時創建新的會話,因此它們會為您緩存一個。 在這種情況下,它會對你起作用,但你應該能夠通過包含“。”來解決這個問題。 主持人結束時的角色。
在我們的例子中,我們嘗試建立與包含由內部CA頒發的證書的Web服務器的連接。 由於我們知道在第一次連接時不會信任CA,因此我們允許連接繼續以便可以下載CA. 在那個連接期間,我們添加“。” 字符到主機的末尾。 所有后續連接都使用不帶“。”的常規URL。 主持人結束時的角色。 這可確保我們下載的CA證書在第一次進行“真正”連接時得到驗證。
我通過添加以下代碼解決了這個問題:
- (void)connection:(NSURLConnection *)connection
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
以上取消了身份驗證挑戰,因此每次都會調用委托者canAuthenticateAgainstProtectionSpace
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.