迁移到WKWebView

我想了解如何在iOS8中使用新的WKWebView,无法find很多信息。 我读了:

http://developer.telerik.com/featured/why-ios-8s-wkwebview-is-a-big-deal-for-hybrid-development/ http://nshipster.com/wkwebkit/

但是这如何影响现有的应用程序? 一个普通的UiWebView会从硝基java脚本引擎中获得加速吗,还是需要进行修改? 我们如何处理向后兼容?

所有的代码和例子,我可以find使用迅捷,这将是强制性的?

感谢在这个问题上的任何帮助!

UIWebView将继续使用现有的应用程序。 WKWebViewiOS8开始,只有WKWebView有一个Nitro JavaScript引擎。

为了利用旧版应用程序中更快的JavaScript引擎,您必须更改代码以使用WKWebView而不是UIWebView 。 对于iOS7iOS7版本,您必须继续使用UIWebView ,因此您可能需要检查iOS8 ,然后应用WKWebView方法/委托方法,并回iOS7及更早版本的UIWebView方法。 也没有WKWebView (还)的Interface Builder组件,所以你必须以编程方式实现WKWebView

您可以在Objective-C中实现WKWebView ,下面是启动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]; 

在WebGL游戏和运行复杂的JavaScriptalgorithm的东西, WKWebView渲染性能是显而易见的,如果你使用webview加载一个简单的HTML或网站,你可以继续使用UIWebView

这里是一个testing应用程序 ,可以使用UIWebViewWKWebView打开任何网站,你可以比较性能,然后决定升级你的应用程序使用WKWebView : https : WKWebViewWKWebView = 8在= 10ltWQ

在这里输入图像说明

这里是我如何从UIWebView转换到WKWebView

注意:没有像UIWebView这样的属性,你可以拖动到你的故事板,你必须以编程的方式来完成。

确保将WebKit / WebKit.h导入到头文件中。

这是我的头文件:

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

这是我的实现文件:

 #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 

Swift不是必需的,Objective-C一切正常。 UIWebView将继续得到支持,所以如果你想花时间,就不会急于迁移。 但是,它不会得到WKWebView的JavaScript和滚动性能增强。

为了向后兼容,我有两个属性我的视图控制器:一个UIWebView和一个WKWebView。 只有当类存在时才使用WKWebview:

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

而我曾经有一个UIWebViewDelegate,我也做了一个WKNavigationDelegate,并创build了必要的方法。

根据Apple文档, WkWebView比UIWebview更快更可靠。 在这里,我发布了我的WkWebViewController。

 import UIKit import WebKit class WebPageViewController: UIViewController,UINavigationControllerDelegate,UINavigationBarDelegate,WKNavigationDelegate{ var webView: WKWebView? var webUrl="http://www.nike.com" override func viewWillAppear(animated: Bool){ super.viewWillAppear(true) navigationController!.navigationBar.hidden = false } override func viewDidLoad() { /* Create our preferences on how the web page should be loaded */ let preferences = WKPreferences() preferences.javaScriptEnabled = false /* Create a configuration for our preferences */ let configuration = WKWebViewConfiguration() configuration.preferences = preferences /* Now instantiate the web view */ webView = WKWebView(frame: view.bounds, configuration: configuration) if let theWebView = webView{ /* Load a web page into our web view */ let url = NSURL(string: self.webUrl) let urlRequest = NSURLRequest(URL: url!) theWebView.loadRequest(urlRequest) theWebView.navigationDelegate = self view.addSubview(theWebView) } } /* Start the network activity indicator when the web view is loading */ func webView(webView: WKWebView,didStartProvisionalNavigation navigation: WKNavigation){ UIApplication.sharedApplication().networkActivityIndicatorVisible = true } /* Stop the network activity indicator when the loading finishes */ func webView(webView: WKWebView,didFinishNavigation navigation: WKNavigation){ UIApplication.sharedApplication().networkActivityIndicatorVisible = false } func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse,decisionHandler: ((WKNavigationResponsePolicy) -> Void)){ //print(navigationResponse.response.MIMEType) decisionHandler(.Allow) } override func didReceiveMemoryWarning(){ super.didReceiveMemoryWarning() } } 

WKWebView在Swift中

步骤:1ViewController.swift导入webkit

 import WebKit 

步骤:2声明webView的variables。

 var webView : WKWebView! 

步骤:3添加WKNavigationDelegate委托

 class ViewController: UIViewController , WKNavigationDelegate{ 

步骤:4ViewDidLoad添加代码。

 let myBlog = "https://iosdevcenters.blogspot.com/" let url = NSURL(string: myBlog) let request = NSURLRequest(URL: url!) // init and load request in webview. webView = WKWebView(frame: self.view.frame) webView.navigationDelegate = self webView.loadRequest(request) self.view.addSubview(webView) self.view.sendSubviewToBack(webView) 

步骤:5编辑info.plist添加带有NSAllowsArbitraryLoads

你的输出

在这里输入图像说明

在iOS 8中使用Swift的WKWebView ..

整个ViewController.swift文件现在看起来像这样:

 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() } } 

使用一些devise模式,你可以混合使用UIWebView和WKWebView。 关键是要devise一个独特的浏览器界面。 但是你应该更加关注你的应用的当前function,例如:如果你的应用使用NSURLProtocol来增强networking能力,使用WKWebView你没有机会做同样的事情。 由于NSURLProtocol只影响当前进程,而WKWebView使用多进程架构,所以networking人员正处于一个独立的过程。

你必须使用WKWebView,它可以从框架“WebKit”的iOS8中获得,以获得加速。 如果您需要向后兼容,则必须使用UIWebView for iOS7及更早版本。

我设置了一个小代码来为新的WKWebView提供UIViewController框架。 它可以通过cocoapods安装。 看看这里:

STKWebKitViewController on github