2014-09-04 16 views
48

Sto cercando di capire come utilizzare il nuovo WKWebView in iOS8, non riesco a trovare molte informazioni. Ho letto:Migrate a WKWebView

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

Ma che modo questo influisce applicazioni esistenti? Un normale UiWebView otterrà la velocità dal motore di script nitro java o sarà necessario apportare modifiche? Come gestiamo la retrocompatibilità?

Tutto il codice e gli esempi che riesco a trovare stanno utilizzando swift, sarà obbligatorio?

Grazie per l'aiuto in proposito!

+0

Forse questo ti aiuterà a: http://floatlearning.com/2014/12/one-webview -to-rule-them-all/ – Koen

+0

http://blog.initlabs.com/post/100113463211/wkwebview-vs-uiwebview – jose920405

+0

Swift v ersione di WKWebView: https://iosdevcenters.blogspot.com/2016/05/creating-simple-browser-with-wkwebview.html –

risposta

1

È necessario utilizzare WKWebView, disponibile da iOS8 in Framework 'WebKit' per ottenere la velocità. Se è necessaria la compatibilità con le versioni precedenti, è necessario utilizzare UIWebView per iOS7 e versioni precedenti.

Ho impostato un piccolo codice per fornire il frame UIViewController per il nuovo WKWebView. Può essere installato tramite cocoapods. Date un'occhiata qui:

STKWebKitViewController on github

9

Swift non è un requisito, tutto funziona bene con Objective-C. UIWebView continuerà ad essere supportato, quindi non c'è fretta di migrare se si vuole prendere tempo. Tuttavia, non otterrà il javascript e miglioramenti delle prestazioni di scorrimento di WKWebView.

Per compatibilità con le versioni precedenti, ho due proprietà per il mio controller di visualizzazione: un UIWebView e un WKWebView. Io uso il WKWebview solo se esiste la classe:

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

Mentre ho usato per avere un UIWebViewDelegate, ho anche fatto un WKNavigationDelegate e ha creato i metodi necessari.

+0

L'utilizzo di [classe WKWebView] per eseguire il controllo in fase di esecuzione è un ottimo punto, molto meglio che controllare numero di versione iOS. – JonSlowCN

5

WKWebView utilizzando Swift in iOS 8 ..

Il file intero ViewController.swift ora assomiglia a questo:

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

utilizzare alcuni modelli di progettazione, potete mescolare UIWebView e WKWebView. Il punto chiave è progettare un'interfaccia browser unica. Tuttavia, dovresti prestare maggiore attenzione alle attuali funzionalità della tua app, ad esempio : se la tua app utilizza NSURLProtocol per migliorare la capacità della rete, utilizzando WKWebView non hai la possibilità di fare la stessa cosa. Poiché NSURLProtocol influisce solo sul processo corrente e WKWebView utilizza l'architettura muliti-process, lo staff di rete si trova in un processo separato.

46

UIWebView continuerà a funzionare con le app esistenti. WKWebView è disponibile a partire da iOS8, solo WKWebView ha un motore JavaScript Nitro.

Per sfruttare questo motore JavaScript più veloce nelle app precedenti, è necessario apportare modifiche al codice per utilizzare WKWebView anziché UIWebView. Per iOS7 e precedenti, è necessario continuare a utilizzare UIWebView, quindi potrebbe essere necessario verificare iOS8 e quindi applicare metodi WKWebView metodi/delegato e metodi di riserva ai metodi UIWebView per iOS7 e precedenti.Inoltre non esiste alcun componente Interface Builder per WKWebView (ancora), quindi è necessario implementare a livello di programmazione WKWebView.

È possibile implementare WKWebView in Objective-C, qui è semplice esempio per avviare una WKWebView: prestazioni

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 di rendering è evidente nei giochi WebGL e qualcosa che corre algoritmi JavaScript complessi, se si sta utilizzando WebView per caricare un semplice html o sito Web, è possibile continuare a utilizzare UIWebView.

Ecco un test app che può utilizzato per aprire qualsiasi sito web utilizzando UIWebView o WKWebView ed è possibile confrontare le prestazioni, e poi decidere su come aggiornare la vostra applicazione per utilizzare WKWebView: https://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ

enter image description here

+0

Considerate anche questo, utilizzando una tecnica per utilizzare WKWebView su iOS 8 e fallback su UIWebView su iOS 7 potrebbe essere eseguito nei problemi di convalida AppStore http://stackoverflow.com/questions/25897123/including-webkit-framework-for-ios8-fails -validation – onmir

+0

Solo una nota: è necessario utilizzare 'NSAppTransportSecurity' con' NSAllowsArbitraryLoads' in 'info.plist' per funzionare. –

28

Qui è il modo in cui sono passato da UIWebView a WKWebView.

Nota: non esiste una proprietà come UIWebView che è possibile trascinare sullo storyboard , è necessario farlo a livello di programmazione.

Assicurarsi di importare WebKit/WebKit.h nel file di intestazione.

Questo è il mio file di intestazione:

#import <WebKit/WebKit.h> 

@interface ViewController : UIViewController 

@property(strong,nonatomic) WKWebView *webView; 
@property (strong, nonatomic) NSString *productURL; 

@end 

Ecco il mio file di implementazione:

#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

come caricare un file locale? Ho provato ma non è apparso nulla sulla pagina. Inoltre, quali sono i metodi delegati come UIWebview. Ad esempio: didloadRequest – Nil

+0

Solo una nota: è necessario utilizzare 'NSAppTransportSecurity' con' NSAllowsArbitraryLoads' in 'info.plist' per funzionare. –

7

WkWebView è molto più veloce e affidabile rispetto UIWebView secondo il Apple docs. Qui, ho pubblicato il mio 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

Fase: 1 Import webkit in ViewController.swift

import WebKit 

Fase: 2 Dichiarare variabili di WebView.

var webView : WKWebView! 

Fase: 3 Aggiunta delegato WKNavigationDelegate

class ViewController: UIViewController , WKNavigationDelegate{ 

Fase: 4 Aggiunta codice 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) 

Passo: 5 Modificare il info.plist aggiungendo NSAppTransportSecurity con NSAllowsArbitraryLoads.

la vostra uscita

enter image description here

+0

come salvare i cookie in wekwebview –

+0

Solo una nota: è necessario utilizzare 'NSAppTransportSecurity' con' NSAllowsArbitraryLoads' in 'info.plist' per funzionare. –

+0

@Carlos Irano Ya. Hai ragione e puoi aggiornare la mia risposta .... –

0

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)