適用於 iOS/macOS 的 HttpClient 和 SSL/TLS 實作選取器
Xamarin.iOS、Xamarin.tvOS 和 Xamarin.Mac 的 HttpClient 實作選取器會控制要使用的實HttpClient
作。 您可以切換至使用 iOS、tvOS 或 macOS 原生傳輸的實作(NSUrlSession
或 CFNetwork
,視 OS 而定)。 缺點是 TLS 1.2 支援、較小的二進位檔,以及更快的下載;缺點是,它需要執行事件迴圈,才能執行異步作業。
項目必須參考 System.Net.Http 元件。
警告
2018 年 4 月 – 由於安全性需求增加,包括 PCI 合規性、主要雲端提供者和網頁伺服器,預計將停止支援 1.2 之前的 TLS 版本。 在舊版Visual Studio中建立的 Xamarin 項目預設為使用舊版 TLS。
為了確保您的應用程式能夠繼續使用這些伺服器和服務, 您應該使用 NSUrlSession
如下所示的設定來更新 Xamarin 專案,然後將您的應用程式 重新建置並重新部署至使用者。
選取 HttpClient 堆疊
若要調整 HttpClient
您的應用程式使用的 :
- 按兩下 方案總管 中的 [項目名稱] 以開啟 [項目選項]。
- 切換至 專案的 [建 置設定] (例如 ,適用於 Xamarin.iOS 應用程式的 iOS 組建 )。
- 從 [ HttpClient 實 作] 下拉式清單中,選取
HttpClient
類型為下列其中一項: NSUrlSession (建議)、 CFNetwork 或 Managed。
提示
針對 TLS 1.2 支援, NSUrlSession
建議使用 選項。
NSUrlSession
NSURLSession
型處理程式是以 iOS 7 和更新版本中可用的原生NSURLSession
架構為基礎。
這是建議的設定。
優點
- 它會使用原生 API 來提升效能和較小的可執行檔大小。
- 支援最新標準,例如 TLS 1.2。
缺點
- 需要 iOS 7 或更新版本。
- 某些
HttpClient
功能/選項無法使用。
CFNetwork
CFNetwork
型處理程式是以 iOS 6 和更新版本中可用的原生CFNetwork
架構為基礎。
優點
- 它會使用原生 API 來提升效能和較小的可執行檔大小。
- 支援較新的標準,例如TLS 1.2。
缺點
- 需要 iOS 6 或更新版本。
- 無法在 watchOS 上使用。
- 某些 HttpClient 功能/選項無法使用。
受控
Managed 處理程式是隨附於舊版 Xamarin 的完全受控 HttpClient 處理程式。
優點
- 它具有與 Microsoft .NET 和舊版 Xamarin 版本最相容的功能集。
缺點
- 它未與 Apple OSes 完全整合,且限製為 TLS 1.0。 未來可能無法連線到安全的網頁伺服器或雲端服務。
- 它通常比原生 API 更慢的加密。
- 其需要更多受控程序代碼,因此會建立較大的應用程式可散發。
以程式設計方式設定 HttpMessageHandler
除了上面所示的專案範圍組態之外,您也可以透過建構函式具現化 HttpClient
並插入所需的 HttpMessageHandler
,如下列代碼段所示:
// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();
// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());
// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());
這可讓您使用與 [項目選項] 對話框中所宣告的專案不同HttpMessageHandler
。
SSL/TLS 實作
SSL(安全套接字層)及其後續版本 TLS(傳輸層安全性),透過提供 HTTP 和其他網路連線 System.Net.Security.SslStream
的支援。 Xamarin.iOS、Xamarin.tvOS 或 Xamarin.Mac 的實作 System.Net.Security.SslStream
會呼叫 Apple 的原生 SSL/TLS 實作,而不是使用 Mono 所提供的受控實作。 Apple 的原生實作支援 TLS 1.2。
警告
即將推出的 Xamarin.Mac 4.8 版只會支援 macOS 10.9 或更高版本。 舊版 Xamarin.Mac 支援 macOS 10.7 或更高版本,但這些較舊的 macOS 版本缺乏足夠的 TLS 基礎結構,無法支援 TLS 1.2。 若要以 macOS 10.7 或 10.8 為目標,請使用 Xamarin.Mac 4.6 或更舊版本。
應用程式傳輸安全性
Apple 的應用程式 傳輸安全性 (ATS) 會強制執行因特網資源(例如應用程式後端伺服器)與應用程式之間的安全連線。 ATS 可確保所有因特網通訊都符合安全的連線最佳做法,藉此防止直接透過您的應用程式或其取用的連結庫意外洩漏敏感性資訊。
由於 ATS 預設會在針對 iOS 9、tvOS 9 和 OS X 10.11 (El Capitan) 和更新版本建置的應用程式中啟用,因此NSUrlSession
所有使用 NSUrlConnection
CFUrl
的連線都會受限於 ATS 安全性需求。 如果您的連線不符合這些需求,這些連線將會失敗併發生例外狀況。
根據 HttpClient Stack 和 SSL/TLS 實作選項,您可能需要對應用程式進行修改,才能正確使用 ATS。
若要深入瞭解 ATS,請參閱我們的 應用程式傳輸安全性指南。
已知問題
本節將討論 Xamarin.iOS 中 TLS 支援的已知問題。
項目無法載入,並出現錯誤「找不到要求的 AppleTLS 值」
Xamarin.iOS 9.8 引進了一些新設定, 其中包含 Xamarin.iOS 應用程式的 .csproj 檔案。 當專案以舊版 Xamarin.iOS 開啟時,這些變更可能會導致問題。 下列螢幕快照是可能在此案例中顯示的錯誤訊息範例:
此錯誤是因為 MtouchTlsProvider
引進 Xamarin.iOS 9.8 中的項目檔設定所造成。 如果無法更新至 Xamarin.iOS 9.8 (或更新版本),則解決方法是手動編輯 .csproj 檔案應用程式、移除 MtouchTlsprovider
專案,然後儲存變更的項目檔。
下列代碼段是 .csproj 檔案中設定可能看起來的樣子範例MtouchTlsProvider
:
<MtouchTlsProvider>Default</MtouchTlsProvider>