Introducing new iOS WebViews
For a long time now, Apple has discouraged using UIWebViews in favor of WKWebView. In iOS 12, which will be released in the upcoming months, UIWebViews will be formally deprecated. React Native's iOS WebView implementation relies heavily on the UIWebView class. Therefore, in light of these developments, we've built a new native iOS backend to the WebView React Native component that uses WKWebView.
The tail end of these changes were landed in this commit, and will become available in the 0.57 release.
To opt into this new implementation, please use the
useWebKit
prop:
<WebView useWebKit={true} source={{url: 'https://www.google.com'}} />
Improvements
UIWebView
had no legitimate way to facilitate
communication between the JavaScript running in the
WebView, and React Native. When messages were sent from
the WebView, we relied on a hack to deliver them to React
Native. Succinctly, we encoded the message data into a url
with a special scheme, and navigated the WebView to it. On
the native side, we intercepted and cancelled this
navigation, parsed the data from the url, and finally
called into React Native. This implementation was error
prone and insecure. I'm glad to announce that we've
leveraged WKWebView
features to completely
replace it.
Other benefits of WKWebView over UIWebView include faster JavaScript execution, and a multi-process architecture. Please see this 2014 WWDC for more details.
Caveats
If your components use the following props, then you may experience problems when switching to WKWebView. For the time being, we suggest that you avoid using these props:
Inconsistent behavior:
automaticallyAdjustContentInsets
and
contentInsets
(commit)
When you add contentInsets to a WKWebView
, it
doesn't change the WKWebView
's viewport. The
viewport remains the same size as the frame. With
UIWebView
, the viewport size actually changes
(gets smaller, if the content insets are positive).
backgroundColor
(commit)
With the new iOS implementation of WebView, there's a
chance that your background color will flicker into view
if you use this property. Furthermore,
WKWebView
renders transparent backgrounds
differently from UIWebview
. Please look at
the commit description for more details.
Not supported:
scalesPageToFit
(commit)
WKWebView didn't support the scalesPageToFit prop, so we couldn't implement this on the WebView React Native component.