70

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

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

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

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

感谢您对此事的任何帮助!

4

9 回答 9

68

UIWebView仍将继续使用现有应用程序。WKWebView从 开始可用iOS8,只有WKWebViewNitro JavaScript 引擎。

要在旧应用程序中利用这个更快的 JavaScript 引擎,您必须更改代码以使用WKWebView而不是UIWebView. ForiOS7和更早的版本,您必须继续使用UIWebView,因此您可能必须检查iOS8然后应用WKWebView方法/委托方法并回退到UIWebViewforiOS7和更早版本的方法。此外(还)没有 Interface Builder 组件WKWebView,因此您必须以编程方式实现WKWebView.

你可以WKWebView在 Objective-C 中实现,这里是一个简单的例子来启动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在 WebGL 游戏和运行复杂 JavaScript 算法的东西中渲染性能很明显,如果您使用 webview 加载简单的 html 或网站,您可以继续使用UIWebView.

这是一个测试应用程序,可用于打开任何网站,UIWebView或者WKWebView您可以比较性能,然后决定升级您的应用程序以使用WKWebViewhttps ://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ

在此处输入图像描述

于 2014-10-25T04:34:40.340 回答
51

这是我从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
于 2014-12-04T19:27:51.130 回答
20

步骤:webkit 1导入ViewController.swift

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>
于 2016-06-01T06:19:17.503 回答
10

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

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

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

虽然我曾经有一个 UIWebViewDelegate,但我也将其设为 WKNavigationDelegate 并创建了必要的方法。

于 2014-09-16T16:37:40.267 回答
8

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

}
于 2015-10-30T09:15:34.013 回答
5

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

}
于 2014-09-24T16:41:30.083 回答
2

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

于 2014-10-10T04:00:19.397 回答
1

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

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

STKWebKitViewController on github

于 2014-09-07T16:27:50.883 回答
0

斯威夫特 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)
于 2017-11-29T09:36:40.890 回答