iOS 11 中的 WebKit 和 Safari 更改
iOS 11 引入了新版本的 Safari Web 浏览器 (Safari 11.0),其中包括对 WebKit 和 SafariServices 的更改。 本指南将探讨这些更改。
SafariServices
SFSafariViewController
已在 iOS 9 中引入,作为显示 Web 内容或从应用对用户进行身份验证的选项。 有关其功能的详细信息,请参阅 Web 视图指南。
iOS 11 引入了 Safari 视图控制器的样式更新,可让用户在应用程序和 Web 之间获得更加无缝的体验。 例如,删除地址栏现在可让 Safari 视图控制器看起来像应用内浏览器,而不是迷你浏览器。 还可以通过设置 preferredBarTintColor
和 PreferredControlTintColor
属性来自定义配色方案,使其与应用的配色方案相符:
sfViewController.PreferredControlTintColor = UIColor.White;
sfViewController.PreferredBarTintColor = UIColor.Purple;
以下代码片段以紫色和白色呈现条形,如下图所示:
Safari 视图控制器中显示的“关闭”按钮也可以通过将 DismissButtonStyle
属性设置为 Done
、Close
或 Cancel
来更改:
sfViewController.DismissButtonStyle = SFSafariViewControllerDismissButtonStyle.Close;
此值可以在显示 SFSafariViewController
时更改。
根据 Safari 视图控制器中显示的内容,可能需要确保菜单栏不会在用户滚动时折叠。 可通过将新的 BarCollapsedEnabled
属性设置为 false
来禁止折叠:
var config = new SFSafariViewControllerConfiguration();
config.BarCollapsingEnabled = false;
var sfViewController = new SFSafariViewController(url, config);
Apple 还对 iOS 11 的 Safari 视图控制器中的隐私进行了更新。 现在,只能按每个应用浏览数据(如 Cookie 和本地存储),而不是跨 Safari 视图控制器的所有实例进行浏览。 这可保障用户浏览活动在应用中的隐私性。
iOS 11 的 SFSafariViewController
中还增加了一些额外功能,如 URL 的拖放支持和对 window.open()
的支持。 有关这些新功能的详细信息,请参阅 Apple 的 SFSafariViewController 文档。
WebKit
WKWebView
是作为 iOS 8 中 WebKit 的一部分引入的,用途是向用户显示 Web 内容。 与 SFSafariViewController
相比,它的可自定义程度更高,你可以创建自己的导航和用户界面。
Apple 在 iOS 11 中为 WKWebView
引入了三项主要改进:
- 能够管理 Cookie
- 内容筛选
- 自定义资源加载
Cookie 管理通过新的 WKHttpCookieStore
类来完成,该类允许添加和删除 Cookie、获取存储在 WKWebView 中的所有 Cookie,以及观察 Cookie 存储中的更改。
通过内容筛选,你可以管理用户将看到的内容类型,从而确保其安全、友好,并在必要时仅可供所选用户组使用。 这通过新的 WKContentRuleList
类来实现,具体是在 JSON 中提供触发器和操作对。 有关这些触发器和操作的详细信息,请参阅 Apple 的内容阻止规则指南。
iOS 11 现在允许使用自定义资源加载为 Web 内容自定义 WKWebView
。 这是通过 IWKUrlSchemeHandler
接口实现的,使你可以处理 WebKit 的非本机 URL 方案。 此接口具有必须实现的 start 和 stop 方法:
public class MyHandler : NSObject, IWKUrlSchemeHandler {
[Export("webView:startURLSchemeTask:")]
public void StartUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask){
// Implement a IWKUrlSchemeTask here
var response = new NSUrlResponse(urlSchemeTask.Request.Url, "text/html", ContentLength, null);
urlSchemeTask.DidReceiveResponse(response);
urlSchemeTask.DidReceiveData(someData);
urlSchemeTask.DidFinish();
}
[Export("webView:stopURLSchemeTask:")]
public void StopUrlSchemeTask(WKWebView webView, IWKUrlSchemeTask urlSchemeTask){
throw new NotImplementedException();
}
}
实现处理程序后,使用它在 WKWebViewConfiguration
上设置 SetUrlSchemeHandler
属性。 然后,加载使用自定义方案的内容的 URL:
var config = new WKWebViewConfiguration();
config.SetUrlSchemeHandler(new MyHandler(), "xamarin-asset");
webView = new WKWebView (View.Frame, config);
webView.LoadRequest (new NSUrlRequest("xamarin-asset://xamarin.com"));