跳至主要内容

引入新的 iOS WebView

·阅读时间:2 分钟
Facebook 软件工程师

长期以来,Apple 一直鼓励开发者放弃使用 UIWebView 而转向 WKWebView。在即将发布的 iOS 12 中,UIWebView 将正式弃用。React Native 的 iOS WebView 实现严重依赖 UIWebView 类。因此,鉴于这些发展,我们为 WebView React Native 组件构建了一个新的原生 iOS 后端,该后端使用 WKWebView。

这些更改的尾声已在此提交中完成,并将出现在 0.57 版本中。

要启用此新实现,请使用useWebKit 属性

<WebView
useWebKit={true}
source={{url: 'https://www.google.com'}}
/>

改进

UIWebView 无法以合法的方式促进在 WebView 中运行的 JavaScript 与 React Native 之间的通信。当从 WebView 发送消息时,我们依靠一种技巧将它们传递给 React Native。简单来说,我们将消息数据编码到带有特殊方案的 URL 中,并导航 WebView 到该 URL。在原生端,我们拦截并取消此导航,从 URL 中解析数据,最后调用 React Native。此实现容易出错且不安全。我很高兴地宣布,我们已利用 WKWebView 功能完全替换了它。

与 UIWebView 相比,WKWebView 的其他优势包括更快的 JavaScript 执行速度和多进程架构。请参阅此2014 年 WWDC以了解更多详细信息。

注意事项

如果您的组件使用以下属性,则在切换到 WKWebView 时可能会遇到问题。目前,我们建议您避免使用这些属性

不一致的行为

automaticallyAdjustContentInsetscontentInsets (提交)

当您向 WKWebView 添加 contentInsets 时,它不会更改 WKWebView 的视口。视口保持与框架相同的大小。使用 UIWebView 时,视口大小实际上会发生变化(如果内容内边距为正,则会变小)。

backgroundColor (提交)

使用 WebView 的新 iOS 实现后,如果您使用此属性,则您的背景颜色可能会闪烁到视图中。此外,WKWebView 对透明背景的渲染方式与 UIWebview 不同。请查看提交说明以了解更多详细信息。

不支持

scalesPageToFit (提交)

WKWebView 不支持 scalesPageToFit 属性,因此我们无法在 WebView React Native 组件上实现它。