2014-09-04 28 views
48

Próbuję zrozumieć, jak korzystać z nowego WKWebView w iOS8, nie mogę znaleźć wiele informacji. Czytałem:Migracja do WKWebView

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

Ale jaki to ma wpływ na istniejące aplikacje? Czy zwykły UiWebView uzyska przyspieszenie z silnika skryptowego nitro java, czy też musimy wprowadzić zmiany? Jak radzimy sobie z kompatybilnością wsteczną?

Cały kod i przykłady, które mogę znaleźć, używają szybkiego, czy będzie to obowiązkowe?

Dziękując za pomoc w tej sprawie!

+0

Może to pomoże: 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 WERSJA WKWebView: https://iosdevcenters.blogspot.com/2016/05/creating-simple-browser-with-wkwebview.html –

Odpowiedz

1

Musisz użyć WKWebView, który jest dostępny od wersji iOS8 w module 'WebKit', aby przyspieszyć działanie. Jeśli potrzebujesz kompatybilności wstecznej, musisz użyć interfejsu UIWebView dla iOS7 i starszych.

Ustawiam mały kod, aby zapewnić ramkę UIViewController dla nowego WKWebView. Można go zainstalować za pomocą cocoapods. Rzucić okiem tutaj:

STKWebKitViewController on github

9

Swift nie jest wymogiem, wszystko działa poprawnie z Objective-C. UIWebView będzie nadal obsługiwany, więc nie musisz się spieszyć, jeśli chcesz poświęcić trochę czasu. Jednak nie dostanie javascript i przewijanie ulepszeń wydajności WKWebView.

W celu zapewnienia kompatybilności wstecz mam dwie właściwości dla kontrolera widoku: UIWebView i WKWebView. Używam WKWebview tylko wtedy, gdy istnieje klasa:

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

Podczas gdy kiedyś mieć UIWebViewDelegate, ja także robione to WKNavigationDelegate i stworzył niezbędnych metod.

+0

Używanie [klasy WKWebView] do sprawdzania czasu wykonywania jest bardzo dobrym punktem, znacznie lepszym niż sprawdzanie Numer wersji systemu iOS. – JonSlowCN

5

WKWebView użyciu Swift w iOS 8 ..

Cały plik ViewController.swift teraz wygląda tak:

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

korzystać z niektórych wzorców projektowych, można mieszać UIWebView i WKWebView. Najważniejsze jest zaprojektowanie unikalnego interfejsu przeglądarki. Należy jednak zwrócić większą uwagę na bieżącą funkcjonalność aplikacji, np. , na przykład: jeśli Twoja aplikacja używa NSURL Protococol w celu zwiększenia możliwości sieci, używając WKWebView, nie masz szansy zrobić tego samego. Ponieważ NSURL Protokół działa tylko na bieżący proces, a WKWebView używa architektury procesu muliti, personel sieciowy jest w oddzielnym procesie.

46

będzie nadal działać z istniejącymi aplikacjami. WKWebView jest dostępna poczynając od iOS8, tylko WKWebView ma silnik JavaScript Nitro.

Aby skorzystać z tego szybszego mechanizmu JavaScript w starszych aplikacjach, należy wprowadzić zmiany kodu, aby użyć WKWebView zamiast UIWebView. Dla iOS7 i starszych, trzeba nadal używać UIWebView, więc być może trzeba będzie sprawdzić iOS8 a następnie zastosować WKWebView metody/metod delegata i awaryjne do UIWebView metod iOS7 i starszych.Ponadto nie ma komponentu Interface Builder dla WKWebView (jeszcze), więc musisz programowo zaimplementować WKWebView.

można zaimplementować WKWebView w Objective-C, oto prosty przykład, aby zainicjować WKWebView: wydajność

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 renderowania jest zauważalne w grach WebGL i coś, co działa złożonych algorytmów JavaScript, jeśli używasz webview Aby załadować prosty html lub stronę internetową, możesz nadal używać UIWebView.

Oto test app które można stosować, aby otworzyć dowolną stronę przy użyciu albo UIWebView lub WKWebView można porównać wydajność, a następnie zdecydować się na uaktualnienie aplikacji do korzystania WKWebView: https://itunes.apple.com/app/id928647773?mt=8&at=10ltWQ

enter image description here

+0

Weź również pod uwagę to, stosując technikę korzystania z WKWebView na iOS 8 i powrót do UIWebView na iOS 7 może mieć problemy z weryfikacją AppStore http://stackoverflow.com/questions/25897123/including-webkit-framework-for-ios8-fails -validation – onmir

+0

Po prostu: potrzebujemy użyć 'NSAppTransportSecurity' z' NSAllowsArbitraryLoads' w 'info.plist' do działania. –

28

Tu jest sposób przeniesienia z UIWebView na WKWebView.

Uwaga: Nie ma właściwość jak UIWebView że można przeciągnąć na swoją storyboard, trzeba to zrobić programowo.

Upewnij się importować WebKit/WebKit.h do pliku nagłówka.

To jest mój plik nagłówka:

#import <WebKit/WebKit.h> 

@interface ViewController : UIViewController 

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

@end 

Oto mój plik realizacja:

#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

jak załadować plik lokalny? Próbowałem, ale nic nie pojawiło się na stronie. Również jakie są metody delegowane, takie jak UIWebview. Na przykład: didloadRequest – Nil

+0

Wystarczy notatkę: potrzebuje użyć 'NSAppTransportSecurity' z' NSAllowsArbitraryLoads' w 'info.plist' do działania. –

7

WkWebView jest znacznie szybszy i niezawodny niż UIWebView według Apple docs. Tutaj opublikowałem mój 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

Etap 1 importu webkit w ViewController.swift

import WebKit 

Etap 2 stwierdzenie zmienną Webview.

var webView : WKWebView! 

krok: 3 Dodawanie Delegat WKNavigationDelegate

class ViewController: UIViewController , WKNavigationDelegate{ 

kroku: 4 dodanie kodu w 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) 

Krok: 5 Edycja info.plist dodanie NSAppTransportSecurity z NSAllowsArbitraryLoads.

wyjściowego

enter image description here

+0

jak zapisać ciasteczko w wekwebview –

+0

Wystarczy notatkę: potrzebuje użyć 'NSAppTransportSecurity' z' NSAllowsArbitraryLoads' w 'info.plist' do pracy. –

+0

@ Carlos Irano Ya. Masz rację i możesz zaktualizować moją odpowiedź .... –

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)