如何迁移到 WKWebView?

我正在试图理解如何在 iOS8中使用新的 WKWebView,找不到太多的信息。我读到:

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

但是这对现有的应用程序有什么影响呢?一个普通的 UiWebView 会从 nitrojava 脚本引擎获得加速吗? 还是我们需要做出改变?我们如何处理向后兼容性?

我能找到的所有代码和示例都使用了迅速,这是强制性的吗?

谢谢你在这件事上的帮助!

115385 次浏览

你必须使用 WKWebView,它在框架‘ WebKit’中的 iOS8中是可用的,以获得加速。 如果需要向后兼容性,则必须对 iOS7和更老版本使用 UIWebView。

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

STKWebKitViewController on github

迅速并不是必需的,Objective-C 中一切都很正常。UIWebView 将继续得到支持,所以如果您想慢慢来,不必急于迁移。但是,它不会得到 WKWebView 的 javascript 和滚动性能增强。

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

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

虽然我曾经有一个 UIWebView氏委托,但是我也将其设置为 WKNavigation氏委托,并创建了必要的方法。

WKWebView 在 iOS8中使用 Swift. 。

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


}

使用一些设计模式,可以混合使用 UIWebView 和 WKWebView。 关键是要设计一个独特的浏览器界面。 但是你应该更加关注你的应用程序当前的功能, 例如: 如果你的应用程序使用 NSULProtocol 来增强网络能力,使用 WKWebView 你就没有机会做同样的事情。因为 NSULProtocol 只影响当前进程,而 WKWebView 使用多进程架构,所以联网人员处于一个单独的进程中。

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

为了在旧的应用程序中利用这个更快的 JavaScript 引擎,你必须更改代码以使用 WKWebView而不是 UIWebView。对于 iOS7及以上版本,您必须继续使用 UIWebView,因此您可能必须检查 iOS8,然后对 iOS7及以上版本应用 WKWebView方法/委托方法并回退到 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 游戏和运行复杂 JavaScript 算法的东西中,WKWebView渲染性能是显而易见的,如果你使用 webview 来加载一个简单的 html 或网站,你可以继续使用 UIWebView

这里有一个测试 应用程序,可以用来打开任何网站使用 UIWebViewWKWebView,你可以比较性能,然后决定升级你的应用程序使用 WKWebView: Https://itunes.apple.com/app/id928647773?mt=8&at=10ltwq

enter image description here

下面是我如何从 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

根据 苹果文档,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()
}


}

步骤: 1 导入 ViewController.swift中的 webkit

import WebKit

步骤: 2 声明 webView 的变量。

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添加

<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>google.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>

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)