Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WKWebView in Production

Loki Meyburg
May 13, 2016
5.5k

WKWebView in Production

Loki Meyburg

May 13, 2016
Tweet

Transcript

  1. What is UIWebView? • Original web rendering component introduced in

    iOS 2.0 • This is what was historically used to build out hybrid apps or load any web content inside an iOS app
  2. UIWebView !== Safari • Mobile Safari tends to load pages

    2-3x faster than a UIWebView • Changes and fixes applied to Safari usually not ported into UIWebView • UIWebview is clunky, crashy, leaks memory • Scrolling blocks images loading • Different JavaScript engine than Safari (not Nitro)
  3. Why does UIWebView not have Nitro? Nitro is excluded because

    Apple wanted to make hybrid apps less performant and force everybody to use their native platform Excluded due to security reasons. Running a Just-In- Time compiler requires marking pages in RAM as executable - iOS does not allow this out of security concerns (except in Safari) Cynical Answer Real Answer
  4. WKWebView Introduced in iOS 8 to give developers a performant

    webview (“same” performance as Safari) WKWebView's rendering is all done in a separate process owned by the WKWebView
  5. WKWebView also gives us… • Significant performance gains in WebGL

    applications (though supported in UIWebview) • Less "crashy" behaviour when rendering bugs are triggered from HTML/CSS/JavaScript
  6. More benefits! • Faster JavaScript and page rendering (thanks Nitro!)

    • 60fps scrolling • Better communication between Swift and JS (we haven’t experimented with this yet) • Since we are sharing the JS engine with Safari, WKWebView should be better maintained and more reliable
  7. How do I implement WKWebView? • Don’t worry, there’s a

    ton of great documentation! • What was formerly a single class (UIWebView) and protocol (UIWebViewDelegate) is now 14 classes and 3 protocols (WKNavigationDelegate, WKScriptMessageHandler, WKUIDelegate) • Other than class docs (and StackOverflow) , no official “How-To WKWebView” from Apple
  8. WKWebView Related Classes WKBackForwardList WKBackForwardListItem WKFrameInfo WKNavigation WKNavigationAction WKNavigationResponse WKPreferences

    WKProcessPool WKScriptMessage WKSecurityOrigin WKUserContentController WKUserScript WKWebViewConfiguration WKWebsiteDataRecord WKWebsiteDataStore WKWindowFeatures WKWebView
  9. More code required • Automatically handled by UIWebView • App

    store links • JS alerts, confirms, inputs • Sharing cookies between web views
  10. Cannot Load Local File URLs • This is sorta critical

    for Mobify’s Hybrid App SDK • UIWebView: • webView!.loadRequest(request)
  11. • High-level: copy the files we need to load into

    a /tmp directory that we can load files from • Alternative: copy files we need to a local webserver running on the device • Fixed in iOS 9 Cannot Load Local File URLs
  12. Cannot intercept POST requests • POST bodies are missing in

    NSURLRequest sent to delegate methods • Solution: for now leave it -- in line with Android behaviour • Good news: WebKit forums indicate this is a bug and there seems to be a bit of traction
  13. UI state preservation/restoration broken • WKWebView cannot be archived and

    doesn’t participate in state/preservation/restoration • Previously used to reduce memory footprint and prevent crashes • Solution: build our own by saving the last known URL
  14. • Seeing some webviews display about:blank for no reason upon

    navigating back • Appears to be a memory issue WSOD: White Screen of Death
  15. WSOD - Our Solution We poll each webview that we

    manage and not currently visible (in the view hierarchy)
  16. • Happens when the frame is not set before load

    completes http://www.openradar.me/22855188 • Had to get creative on this one. • Turns out, duplicate <head> tags are ignored… • … so we create a <head> tag at the beginning JUST to scroll back up Views Appear Halfway Down
  17. View Doesn’t Render Until Visible • Big problem for preloading

    tabs in a tab bar layout • Bigger problem if you rely on Javascript to run in those webviews • Solution is an off-screen “holding pen” for web views not currently visible
  18. WKWebView and Certs • Bug in WKWebView where the documented

    way of doing custom analysis of SSL certificates is broken • webView(_:didReceiveAuthenticationChallenge:completionHandler:) is never called • Important for internal use • No workaround
  19. Need to know about these: • When app is sent

    to background, JS stops executing in ~10sec while native code (and JS in UIWebView) keeps running for ~3 min until completely suspended by OS. • Unlike UIWebView, the webView.URL property is updated to the navigation target before webView:decidePolicyForNavigationAction:decisionHandler in WKWebView. • App store links don’t work by default -- have to intercept requests (http://atmarkplant.com/ios-wkwebview-tips/#applink)
  20. Q&A