Xamarin.iOS 中的 Web 檢視

在iOS Apple的存留期內,已發行數種方式讓應用程式開發人員在其應用程式中納入Web檢視功能。 大部分的用戶都會在其 iOS 裝置上使用內建 Safari 網頁瀏覽器,因此預期來自其他應用程式的網頁檢視功能與這項體驗一致。 他們預期相同的手勢能夠運作、效能會相同,且功能相同。

iOS 11 對 和SFSafariViewController引進了新的變更WKWebView。 如需這些的詳細資訊,請參閱 iOS 11 中的 Web 變更指南

WKWebView

WKWebView 已在 iOS 8 中引進,可讓應用程式開發人員實作類似於行動 Safari 的 Web 瀏覽介面。 WKWebView部分原因是使用 Nitro Javascript 引擎,這是行動 Safari 所使用的相同引擎。 WKWebView 應該一律透過UIWebView使用,因為效能增加、內建用戶易記手勢,以及網頁與應用程式之間的互動便利性。

WKWebView 您可以將幾乎與UIWebView相同的方式新增至您的應用程式,不過,身為開發人員,您對UI/UX和功能有更多的控制權。 建立及顯示 Web 檢視物件將會顯示要求的頁面,不過您可以控制檢視的呈現方式、使用者如何流覽,以及使用者如何結束檢視。

下列程式代碼可用來在您的 Xamarin.iOS 應用程式中啟動 WKWebView

WKWebView webView = new WKWebView(View.Frame, new WKWebViewConfiguration());
View.AddSubview(webView);

var url = new NSUrl("https://learn.microsoft.com");
var request = new NSUrlRequest(url);
webView.LoadRequest(request);

請務必注意,在 WKWebView 命名空間中 WebKit ,因此您必須將這個using指示詞新增至類別頂端。

WKWebView 也可以在 Xamarin.Mac 應用程式中使用,而且如果您要建立跨平臺 Mac/iOS 應用程式,則應該使用它。

Handle JavaScript Alerts 配方也提供搭配使用 WKWebView 與 Javascript 的資訊。

SFSafariViewController

SFSafariViewController 是從您的應用程式提供 Web 內容的最新方式,可在 iOS 9 和更新版本中取得。 不同於 UIWebViewWKWebViewSFSafariViewController 是檢視控制器,因此無法與其他檢視搭配使用。 您應該以新的檢視控制器的形式呈現 SFSafariViewController ,就像您呈現任何檢視控制器一樣。

SFSafariViewController 基本上是可以內嵌到應用程式的「迷你 Safari」。 和 WKWebView 一樣,它使用相同的 Nitro Javascript 引擎,但也提供一系列額外的 Safari 功能,例如自動填入、讀取器,以及與行動 Safari 共用 Cookie 和數據的能力。 使用者與 SFSafariViewController 應用程式的互動無法存取。 您的應用程式將無法存取任何預設 Safari 功能。

它預設也會實作 [完成] 按鈕,讓用戶輕鬆返回您的應用程式,以及向前和返回瀏覽按鈕,讓使用者流覽一堆網頁。 此外,它也為使用者提供了網址列,讓他們安心地在預期的網頁上。 網址列不允許用戶變更 URL。

這些實作無法變更,因此 SFSafariViewController ,如果您的 app 想要在沒有任何自定義的情況下呈現網頁,則適合用來做為預設瀏覽器。

下列程式代碼可用來在您的 Xamarin.iOS 應用程式中啟動 SFSafariViewController

var sfViewController = new SFSafariViewController(url);

PresentViewController(sfViewController, true, null);

這會產生下列網頁檢視:

An example web view with SFSafariViewController

Safari

您也可以使用下列程式代碼,從您的應用程式內開啟行動 Safari 應用程式:

var url = new NSUrl("https://learn.microsoft.com");

UIApplication.SharedApplication.OpenUrl(url);

這會產生下列網頁檢視:

A web page presented in Safari

將使用者從您的應用程式巡覽至 Safari 通常應該一律避免。 大部分的使用者都不會預期在應用程式外流覽,因此,如果您離開應用程式,使用者可能永遠不會傳回它,基本上會終止參與。

iOS 9 改進功能可讓使用者透過 Safari 頁面左上角提供的 [上一頁] 按鈕輕鬆地返回您的應用程式。

應用程式傳輸安全性

Apple 在 iOS 9 中引進應用程式傳輸安全性或 ATS ,以確保所有因特網通訊都符合安全的連線最佳做法。

如需 ATS 的詳細資訊,包括如何在應用程式中實作,請參閱 應用程式傳輸安全性 指南。

UIWebView 淘汰

UIWebView 是 Apple 在應用程式中提供 Web 內容的舊版方式。 它已在 iOS 2.0 中發行,自 8.0 起已被取代。

重要

UIWebView 已被取代。 自 2020 年 4 月起,將不會 將使用此控件的新應用程式接受到 App Store,且使用此控件的應用程式更新將不會在 2020 年 12 月前接受。

UIWebView Apple 的文件建議應用程式應該改用WKWebView

如果您在使用 Xamarin.Forms 時尋找取代警告 (ITMS-90809) 的資源 UIWebView ,請參閱 Xamarin.Forms WebView 檔。

在過去六個月左右提交 iOS 應用程式的開發人員可能會收到 App Store UIWebView 關於已被取代的警告。

API 的取代很常見。 Xamarin.iOS 會使用自定義屬性向開發人員發出這些 API 的訊號(並在可用時建議取代專案)。 這一次和較不常見的不同之處是,在提交時,Apple App Store 會強制執行淘汰

不幸的是,從中移除UIWebView類型是二進位中斷性變更Xamarin.iOS.dll 這項變更將會中斷現有的第三方連結庫,包括某些可能不再支援或甚至可重新編譯的連結庫(例如,封閉式來源)。 這隻會為開發人員建立其他問題。 因此,我們尚未移除類型

Xamarin.iOS 13.16 開始,有新的偵測和工具可協助您從 UIWebView移轉。

偵測

如果您最近已將 iOS 應用程式提交至 Apple App Store,您可能會想知道這種情況是否適用於您的應用程式。

若要瞭解,您可以將 新增--warn-on-type-ref=UIKit.UIWebView至專案的 [其他 mtouch] 自變數。這會警告應用程式內已被UIWebView取代的任何參考(及其所有相依性)。 執行 Managed 連結器之前之後,會使用不同的警告來報告類型

警告和其他警告一樣,可以使用 轉換成錯誤 -warnaserror:。 如果您想要確保驗證之後不會新增 對 UIWebView 的新相依性,這非常有用。 例如:

  • -warnaserror:1502 如果在預先連結的元件中找到任何參考,將會報告錯誤。
  • -warnaserror:1503 如果在連結後元件中找到任何參考,將會報告錯誤。

如果前置/張貼鏈接結果不實用,您也可以讓警告保持沉默。 例如:

  • -nowarn:1502如果在預先連結的元件中找到任何參考,將不會報告警告。
  • -nowarn:1503如果在連結後元件中找到任何參考,將不會報告警告。

去除

每個應用程式都是唯一的。 從您的應用程式移除 UIWebView 可能需要不同的步驟,視其使用方式和位置而定。 最常見的案例如下:

  • 您的應用程式內不會使用 UIWebView 。 一切都沒問題。 提交至 AppStore 時,您不應該有警告。 您不需要任何其他專案。
  • 應用程式的直接使用 UIWebView 方式。 首先,移除您使用 UIWebView的 ,例如,將它取代為較 WKWebView 新的 (iOS 8) 或 SFSafariViewController (iOS 9) 類型。 完成之後,Managed 連結器就不應該看到任何參考 UIWebView ,而最終的應用程式二進位檔將不會追蹤它。
  • 間接使用方式。 UIWebView 可以存在於您的應用程式所使用的某些第三方連結庫中,可以是受控或原生連結庫。 從將外部相依性更新至其最新版本開始,因為這種情況可能已在較新版本中解決。 如果沒有,請連絡連結庫的維護人員,並詢問其更新計劃。

或者,您可以嘗試下列方法:

  1. 如果您使用 Xamarin.Forms,請閱讀此 部落格文章
  2. 啟用 Managed 連結器(在整個專案上,或至少使用的相依性 UIWebView),因此 若未參考,可能會 移除它。 這可以解決問題,但可能需要額外的工作,讓您的程式代碼連結器安全。
  3. 如果您無法變更 Managed 連結器設定,請參閱下列特殊案例。

應用程式無法使用連結器(或變更其設定)

如果基於某些原因,您 使用 Managed 連結器(例如 不要連結),則 UIWebView 符號會保留在您提交至 Apple 的二進位應用程式中,而且可能會遭到拒絕。

強制的解決方案是新增--optimize=force-rejected-types-removal至您專案的 [其他 mtouch] 自變數。 這會從應用程式移除的 UIWebView 追蹤。 不過,任何參考型別的程式代碼將無法正常運作(預期例外狀況或當機)。 只有當您確定程式代碼在運行時間無法連線時,才應該使用此方法(即使它可透過靜態分析連線)。

支援 iOS 7.x(或更早版本)

UIWebView 自 v2.0 起一直是 iOS 的一部分。 最常見的替代專案是 WKWebView (iOS 8) 和 SFSafariViewController (iOS 9)。 如果您的應用程式仍然支援較舊的 iOS 版本,您應該考慮下列選項:

  • 將 iOS 8 設為您的最低目標版本(組建時間決策)。
  • 只有在應用程式在 iOS 8+ 上執行時才使用 WKWebView (運行時間決策)。

未提交至Apple的應用程式

如果您的應用程式未提交至 Apple,您應該計劃從已被取代的 API 移開,因為它可以在未來的 iOS 版本中移除。 不過,您可以使用自己的時程表來執行此轉換。