介绍新的 iOS WebViews
长期以来,苹果一直不鼓励使用 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 发送时,我们依赖一种 hack 方式将其传递给 React Native。简而言之,我们将消息数据编码到具有特殊 scheme 的 URL 中,并将 WebView 导航到该 URL。在原生端,我们拦截并取消了此导航,从 URL 中解析数据,最后调用到 React Native。这种实现方式容易出错且不安全。我很高兴地宣布,我们已经利用 WKWebView
的功能完全取代了它。
WKWebView 相对于 UIWebView 的其他优势包括更快的 JavaScript 执行速度和多进程架构。请观看 2014 WWDC 视频 了解更多详情。
注意事项
如果你的组件使用了以下属性,那么在切换到 WKWebView 时可能会遇到问题。目前,我们建议你避免使用这些属性
行为不一致
automaticallyAdjustContentInsets
和 contentInsets
(commit)
当你向 WKWebView
添加 contentInsets 时,它不会更改 WKWebView
的视口。视口尺寸与框架尺寸保持一致。使用 UIWebView
,视口尺寸实际上会发生变化(如果内容内边距为正值,则会变小)。
backgroundColor
(commit)
使用新的 iOS WebView 实现,如果你使用此属性,背景颜色可能会闪烁可见。此外,WKWebView
渲染透明背景的方式与 UIWebView
不同。请查看提交描述了解更多详情。
不支持
scalesPageToFit
(commit)
WKWebView 不支持 scalesPageToFit 属性,因此我们无法在 WebView React Native 组件上实现此功能。