How to Migrate to WKWebView?

后端 未结 9 1398
后悔当初
后悔当初 2020-11-30 22:23

I\'m trying to understand how to make use of the new WKWebView in iOS8, can\'t find much information. I\'ve read:

http://developer.telerik.com/featured/why-ios-8s-wk

相关标签:
9条回答
  • 2020-11-30 22:45

    Here is how I transitioned from UIWebView to WKWebView.

    Note: There is no property like UIWebView that you can drag onto your storyboard, you have to do it programatically.

    Make sure you import WebKit/WebKit.h into your header file.

    This is my header file:

    #import <WebKit/WebKit.h>
    
    @interface ViewController : UIViewController
    
    @property(strong,nonatomic) WKWebView *webView;
    @property (strong, nonatomic) NSString *productURL;
    
    @end
    

    Here is my implementation file:

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.productURL = @"http://www.URL YOU WANT TO VIEW GOES HERE";
    
        NSURL *url = [NSURL URLWithString:self.productURL];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        _webView = [[WKWebView alloc] initWithFrame:self.view.frame];  
        [_webView loadRequest:request];
        _webView.frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
        [self.view addSubview:_webView];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
    
    0 讨论(0)
  • 2020-11-30 22:46

    UIWebView will still continue to work with existing apps. WKWebView is available starting from iOS8, only WKWebView has a Nitro JavaScript engine.

    To take advantage of this faster JavaScript engine in older apps you have to make code changes to use WKWebView instead of UIWebView. For iOS7 and older, you have to continue to use UIWebView, so you may have to check for iOS8 and then apply WKWebView methods / delegate methods and fallback to UIWebView methods for iOS7 and older. Also there is no Interface Builder component for WKWebView (yet), so you have to programmatically implement WKWebView.

    You can implement WKWebView in Objective-C, here is simple example to initiate a WKWebView:

    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
    webView.navigationDelegate = self;
    NSURL *nsurl=[NSURL URLWithString:@"http://www.apple.com"];
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
    [webView loadRequest:nsrequest];
    [self.view addSubview:webView];
    

    WKWebView rendering performance is noticeable in WebGL games and something that runs complex JavaScript algorithms, if you are using webview to load a simple html or website, you can continue to use UIWebView.

    Here is a test app that can used to open any website using either UIWebView or WKWebView and you can compare performance, and then decide on upgrading your app to use WKWebView: https://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ

    enter image description here

    0 讨论(0)
  • 2020-11-30 22:47

    Swift is not a requirement, everything works fine with Objective-C. UIWebView will continue to be supported, so there is no rush to migrate if you want to take your time. However, it will not get the javascript and scrolling performance enhancements of WKWebView.

    For backwards compatibility, I have two properties for my view controller: a UIWebView and a WKWebView. I use the WKWebview only if the class exists:

    if ([WKWebView class]) {
        // do new webview stuff
    } else {
        // do old webview stuff
    }
    

    Whereas I used to have a UIWebViewDelegate, I also made it a WKNavigationDelegate and created the necessary methods.

    0 讨论(0)
  • 2020-11-30 22:50

    WKWebView using Swift in iOS 8..

    The whole ViewController.swift file now looks like this:

    import UIKit
    import WebKit
    
    class ViewController: UIViewController {
    
        @IBOutlet var containerView : UIView! = nil
        var webView: WKWebView?
    
        override func loadView() {
            super.loadView()
    
            self.webView = WKWebView()
            self.view = self.webView!
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            var url = NSURL(string:"http://www.kinderas.com/")
            var req = NSURLRequest(URL:url)
            self.webView!.loadRequest(req)
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
    }
    
    0 讨论(0)
  • 2020-11-30 22:51

    You have to use WKWebView, which is available as of iOS8 in Framework 'WebKit' to get the speedup. If you need backwards compatibility, you have to use UIWebView for iOS7 and older.

    I set up a little code to provide the UIViewController frame for the new WKWebView. It can be installed via cocoapods. Have a look here:

    STKWebKitViewController on github

    0 讨论(0)
  • 2020-11-30 22:51

    Swift 4

        let webView = WKWebView()   // Set Frame as per requirment, I am leaving it for you
        let url = URL(string: "http://www.google.com")!
        webView.load(URLRequest(url: url))
        view.addSubview(webView)
    
    0 讨论(0)
提交回复
热议问题