2016-03-20 39 views
1

我有一些邏輯與具有兩個版本,NSURLConnection和NSURLSession的後端服務器進行通信。後者是因爲NSURLConnection已被棄用,我們還想利用後臺下載功能。編寫這些類是爲了支持客戶端證書來驗證客戶端。NSURLSession和NSURLConnection的使用,因爲它涉及到共享一個SSL會話

執行此通信的類在我的應用程序中通過幾種不同類型的例程調用。

我看到的問題是,當使用NSURLSession版本時,我發現SSL(TLSv1)會話永遠不會被重用,並且有一個完整的[Client Hello,Server Hello,Certificate,Certificate,Client密鑰交換,證書驗證等]。看看「客戶端Hello」消息,我可以看到消息中永遠沒有「會話ID」,所以我認爲這就是SSL會話永遠不會被重用的原因。

在舊的NSURLConnection版本上,我發現經常會話被重用,並在「Client Hello」消息中給出了以前的會話ID。

在這兩種方法中,我都創建了NSURLConnection或NSURLSession的新實例。我認爲發生的事情是NSURLConnection適用於整個應用程序,而NSURLSession則不適用。

但是,我不知道我應該如何編寫NSURLSession邏輯,以便SSL會話在服務器和客戶端之間共享,並且客戶端證書不會每次都發送。我認爲一種方法可能是使用單個NSURLSession實例,但我不確定這是否是正確的設計模式。

回答

0

隨着NSURLSession,連接不會在多個會話共享的,因爲不同的會話可以,對併發連接,不同的保活設置,不同的代理服務器設置的最大數量等不同的限制

因此,如果您每個會話只會提出一個請求,您最終每次都會創建一個新連接,並完成整個TLS設置開銷。

有兩種簡單的方法來解決這個問題:

  • 創建一個會話,當你啓動應用程序,並在任何地方使用它。
  • 使用共享會話([NSURLSession sharedSession])。

如果你正在做後臺下載,該會話需要創建一次,當你的應用程序首次啓動時,從來就不是重建(除非會議以響應您的應用程序創建得到重新啓動在後臺處理某些任務的結果,在這種情況下,IIRC會話將變爲無效,所以如果您的應用隨後以常規方式啓動或以其他方式再次重新創建)。