iOS 11 中的 WebKit 和 Safari 更改

iOS 11 引入了新版本的 Safari Web 浏览器 (Safari 11.0),其中包括对 WebKit 和 SafariServices 的更改。 本指南将探讨这些更改。

SafariServices

SFSafariViewController 已在 iOS 9 中引入,作为显示 Web 内容或从应用对用户进行身份验证的选项。 有关其功能的详细信息,请参阅 Web 视图指南。

iOS 11 引入了 Safari 视图控制器的样式更新,可让用户在应用程序和 Web 之间获得更加无缝的体验。 例如,删除地址栏现在可让 Safari 视图控制器看起来像应用内浏览器,而不是迷你浏览器。 还可以通过设置 preferredBarTintColorPreferredControlTintColor 属性来自定义配色方案,使其与应用的配色方案相符:

sfViewController.PreferredControlTintColor = UIColor.White;
sfViewController.PreferredBarTintColor = UIColor.Purple;

以下代码片段以紫色和白色呈现条形,如下图所示:

SFSafariViewController bars rendered in purple and white

Safari 视图控制器中显示的“关闭”按钮也可以通过将 DismissButtonStyle 属性设置为 DoneCloseCancel 来更改:

sfViewController.DismissButtonStyle = SFSafariViewControllerDismissButtonStyle.Close;

Dismiss button text changed

此值可以在显示 SFSafariViewController 时更改。

根据 Safari 视图控制器中显示的内容,可能需要确保菜单栏不会在用户滚动时折叠。 可通过将新的 BarCollapsedEnabled 属性设置为 false 来禁止折叠:

var config = new SFSafariViewControllerConfiguration();
config.BarCollapsingEnabled = false;

var sfViewController = new SFSafariViewController(url, config);

Bar collapsing disabled

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"));