2014-09-04 132 views
48

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

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

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

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

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

+0

也许这将帮助你:http://floatlearning.com/2014/12/one-webview -to-rule-them-all/ – Koen 2015-01-31 22:53:30

+0

http://blog.initlabs.com/post/100113463211/wkwebview-vs-uiwebview – jose920405 2015-11-19 14:15:37

+0

Swift v WKWebView的ersion:https://iosdevcenters.blogspot.com/2016/05/creating-simple-browser-with-wkwebview.html – 2016-05-27 07:40:54

回答

1

你必须使用WKWebView,这可作为iOS8上的框架“的WebKit”来获得加速。 如果您需要向后兼容性,则必须使用UIWebView for iOS7及更早版本。

我成立了一个小代码,以提供新的WKWebView框架的UIViewController。它可以通过cocoapods进行安装。看看这里:

STKWebKitViewController on github

9

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

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

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

尽管我曾经有一个UIWebViewDelegate,我也做了它WKNavigationDelegate,创造必要的方法。

+0

使用[WKWebView类]进行运行时检查是一个很好的观点,比检查iOS版本号。 – JonSlowCN 2015-07-17 08:55:49

5

WKWebView iOS中使用8雨燕..

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

} 
2

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

46

UIWebView仍将继续使用现有的应用程序工作。 WKWebViewiOS8开始有效,只有WKWebView拥有Nitro JavaScript引擎。

要在旧版应用程序中利用此更快的JavaScript引擎,您必须更改代码以使用WKWebView而不是UIWebView。对于iOS7及更高版本,您必须继续使用UIWebView,因此您可能必须检查iOS8,然后应用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]; 

WKWebView渲染性能是WebGL的游戏明显,一些运行复杂的JavaScript的算法,如果你使用的WebView加载一个简单的html或网站,您可以继续使用UIWebView

下面是测试app可用于使用任何UIWebViewWKWebView,你可以比较性能打开任何网站,然后决定将应用升级为使用WKWebViewhttps://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ

enter image description here

+0

也考虑到这一点,使用在iOS 8上使用WKWebView的技术并且回退到iOS 7上的UIWebView可能会遇到AppStore验证问题http://stackoverflow.com/questions/25897123/including-webkit-framework-for-ios8-fails验证 – onmir 2015-11-24 09:53:03

+0

只需要注意:需要在'info.plist'中使用'NSAppTransportSecurity'和'NSAllowsArbitraryLoads'来工作。 – 2017-09-03 19:07:04

28

这里是我如何从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 
+1

如何加载本地文件?我尝试过,但没有出现在网页上。还有像UIWebview这样的委托方法。例如:didloadRequest – Nil 2016-10-12 14:07:25

+0

只需要注意:需要在'info.plist'中使用'NSAppTransportSecurity'和'NSAllowsArbitraryLoads'来工作。 – 2017-09-03 19:07:10

7

WkWebView比UIWebView的更快,可靠的根据Apple docs。 在这里,我发布了我的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() 
    } 

} 
7

WKWebView in Swift

步骤:1导入webkitViewController.swift

import WebKit 

步骤:2声明web视图的变量。

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加入NSAppTransportSecurityNSAllowsArbitraryLoads

你的输出

enter image description here

+0

如何在wekwebview中保存cookie – 2017-08-25 07:43:55

+0

只需要注意:需要在'info.plist'中使用'NSAppTransportSecurity'和'NSAllowsArbitraryLoads'才能工作。 – 2017-09-03 19:07:25

+0

@Carlos伊朗雅。你是对的,并可以更新我的答案.... – 2017-09-03 22:40:52

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)