跳至主内容

全新 iOS WebView 组件发布

· 1 分钟阅读
Facebook 软件工程师
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

长期以来,Apple 一直建议开发者使用 WKWebView 替代 UIWebView。在即将发布的 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 发送时,我们依赖一种变通方案进行传递:先将消息数据编码到特殊协议的 URL 中,再导航 WebView 至该 URL。在原生端,我们拦截并取消此导航,解析 URL 中的数据,最终调用 React Native。这种实现方式不仅容易出错且存在安全隐患。很高兴向大家宣布,我们现已利用 WKWebView 的特性完全重构了此机制。

WKWebView 相较于 UIWebView 的其他优势包括更快的 JavaScript 执行速度和多进程架构。更多细节请参考 2014 年 WWDC

注意事项

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

行为不一致:

automaticallyAdjustContentInsetscontentInsets (提交记录)

WKWebView 添加 contentInsets 时,WKWebView 的视口(viewport)尺寸不会改变,仍保持与框架相同的尺寸。而 UIWebView 的实际视口尺寸会发生变化(当内容边距为正数时视口会缩小)。

backgroundColor (提交记录)

使用新的 iOS WebView 实现时,此属性可能导致背景色出现闪烁现象。此外,WKWebViewUIWebview 渲染透明背景的方式存在差异,具体细节请查看提交说明。

不受支持:

scalesPageToFit (提交记录)

由于 WKWebView 本身不支持 scalesPageToFit 属性,我们无法在 React Native 的 WebView 组件中实现此功能。