2014-09-04 175 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)