跳到主要内容

引入新的 iOS WebViews

·3 分钟阅读
Facebook 软件工程师

长期以来,Apple 一直不鼓励使用 UIWebView,而青睐 WKWebView。在未来几个月将发布的 iOS 12 中,UIWebView 将被正式弃用。React Native 的 iOS WebView 实现严重依赖 UIWebView 类。因此,鉴于这些发展,我们为 WebView React Native 组件构建了一个新的原生 iOS 后端,它使用 WKWebView。

这些更改的最后部分已在此提交中落地,并将随0.57版本发布。

要选择此新实现,请使用useWebKit prop。

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

改进

UIWebView 没有合法的方式来促进 WebView 中运行的 JavaScript 与 React Native 之间的通信。当从 WebView 发送消息时,我们依赖一个 hack 来将它们传递给 React Native。简而言之,我们将消息数据编码成一个带有特殊方案的 URL,并导航 WebView 到该 URL。在原生端,我们拦截并取消了这次导航,从 URL 中解析出数据,最后调用了 React Native。这种实现容易出错且不安全。我很高兴地宣布,我们利用 WKWebView 的特性完全取代了它。

WKWebView 相对于 UIWebView 的其他优点包括更快的 JavaScript 执行和多进程架构。请参阅 2014 年 WWDC 了解更多详情。

注意事项

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

不一致的行为

automaticallyAdjustContentInsetscontentInsets (提交)

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

backgroundColor (提交)

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

不支持

scalesPageToFit (提交)

WKWebView 不支持 `scalesPageToFit` 属性,因此我们无法在 WebView React Native 组件中实现此功能。