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 和更新版本中取得。 不同於 UIWebView
或 WKWebView
, SFSafariViewController
是檢視控制器,因此無法與其他檢視搭配使用。 您應該以新的檢視控制器的形式呈現 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);
這會產生下列網頁檢視:
Safari
您也可以使用下列程式代碼,從您的應用程式內開啟行動 Safari 應用程式:
var url = new NSUrl("https://learn.microsoft.com");
UIApplication.SharedApplication.OpenUrl(url);
這會產生下列網頁檢視:
將使用者從您的應用程式巡覽至 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
可以存在於您的應用程式所使用的某些第三方連結庫中,可以是受控或原生連結庫。 從將外部相依性更新至其最新版本開始,因為這種情況可能已在較新版本中解決。 如果沒有,請連絡連結庫的維護人員,並詢問其更新計劃。
或者,您可以嘗試下列方法:
- 如果您使用 Xamarin.Forms,請閱讀此 部落格文章。
- 啟用 Managed 連結器(在整個專案上,或至少使用的相依性
UIWebView
),因此 若未參考,可能會 移除它。 這可以解決問題,但可能需要額外的工作,讓您的程式代碼連結器安全。 - 如果您無法變更 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 版本中移除。 不過,您可以使用自己的時程表來執行此轉換。