迁移到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
将继续使用现有的应用程序。 WKWebView
从iOS8
开始,只有WKWebView
有一个Nitro JavaScript引擎。
为了利用旧版应用程序中更快的JavaScript引擎,您必须更改代码以使用WKWebView
而不是UIWebView
。 对于iOS7
及iOS7
版本,您必须继续使用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应用程序 ,可以使用UIWebView
或WKWebView
打开任何网站,你可以比较性能,然后决定升级你的应用程序使用WKWebView
: https : WKWebView
? WKWebView
= 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中
步骤:1在ViewController.swift
导入webkit
import WebKit
步骤:2声明webView的variables。
var webView : WKWebView!
步骤:3添加WKNavigationDelegate
委托
class ViewController: UIViewController , WKNavigationDelegate{
步骤:4在ViewDidLoad
添加代码。
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