iOS 11中的自定义方案处理和WKWebview

Apple希望每个人在将其作为iOS 8 SDK的一部分发布时,从完美的UIWebview迁移到新的WKWebView

甚至有一个“美丽”的警告消息,并且已经存在了四年了……嗯,你知道吗? 大多数应用程序仍使用UIWebView ,因为它易于使用和完成工作。 但是,您确实应该迁移到WKWebView ,因为它由WebKit框架直接支持,它具有更多功能,并且使用了更快的JavaScript引擎。

在Glose图书中,作为读者的一部分,我们广泛使用UIWebView ,即使它是非常自定义的,也融合了本机和Web交互以及UI。 是的,新的Javascript桥(称为WKScriptMessageHandler )是WKWebView最精彩的东西之一。 书籍的核心内容仍为HTML格式。 因此,使用浏览器视图(UIWebView或其他任何视图)来显示它是有意义的。 在我们应用程序的当前版本中,我们的阅读器仍在UIWebview上运行(可耻,可耻,可耻),因为当时它是唯一可用的解决方案。

在开发版本中,我们制作了一个全新的移动阅读器,这次它基于WKWebView 。 为什么花了我们这么长时间? 因为直到iOS 11 SDK都没有办法使用WKWebView来处理自定义url方案加载。 使用WKWebView仍然有很多优点,但是自定义方案加载是一个总的障碍

UIWebView支持自定义NSURLProtocol ,这意味着为了提供一种自定义方式来加载自定义url方案,您只需创建NSURLProtocol的子类,然后向NSURLProtocol注册您的类。 然后,任何调用您的自定义方案的东西(例如helloworld://)都会调用您的自定义NSURLProtocol类。 然后,您负责加载和转发您的内容。 这是非常强大的功能,在我们的案例中,我们使用它来加载书籍中的各种资产,例如图像,视频等。 我们可以使用很多变通方法,但是它们大多是黑客,对于生产应用程序来说并不好。

WKWebview不支持自定义NSURLProtocol ,因此您可以注册所需的任何类,由于WKWebView请求,它永远不会被调用。 好吧! 苹果在iOS 11中添加了WKURLSchemeHandler 。 它的工作原理与NSURLProtocol几乎相同!

这是一些您可以理解的代码示例,因为老实说,您实际上并不关心上面所有的废话。

因此,首先创建WKURLSchemeHandler子类,必须实现start和stop这两个方法。 只有start方法才有意义,因为这是您要做的工作。

stop方法可以保留为空,或用于您进行任何必要的清理。

您可以访问完整的请求,因此您可以检查,从url中提取任何内容,加载所需的数据并将其转发到WKWebView 。 然后,您的内容应加载。

在创建类之后,您必须在WKWebView中注册它,并且在创建其配置时必须这样做:

一切就绪,现在您可以在WKWebView中加载任何自定义内容了!