tutorial raywenderlich example apple uiwebview ios8 wkwebview

uiwebview - raywenderlich - Migrar a WKWebView



wkwebview swift 4 example (9)

Aquí es cómo hice la transición de UIWebView a WKWebView .

Nota: no hay ninguna propiedad como UIWebView que puedas arrastrar a tu guión gráfico, debes hacerlo programáticamente.

Asegúrese de importar WebKit / WebKit.h en su archivo de encabezado.

Este es mi archivo de cabecera:

#import <WebKit/WebKit.h> @interface ViewController : UIViewController @property(strong,nonatomic) WKWebView *webView; @property (strong, nonatomic) NSString *productURL; @end

Aquí está mi archivo de implementación:

#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

Estoy tratando de entender cómo hacer uso del nuevo WKWebView en iOS8, no puedo encontrar mucha información. He leído:

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

Pero, ¿cómo afecta esto a las aplicaciones existentes? ¿Un UiWebView normal obtendrá la aceleración del motor de script de nitro java o debemos hacer cambios? ¿Cómo lidiamos con la compatibilidad hacia atrás?

Todos los códigos y ejemplos que puedo encontrar están usando swift, ¿será obligatorio?

Agradecido por cualquier ayuda en este asunto!


Debe utilizar WKWebView, que está disponible a partir de iOS8 en el Framework ''WebKit'' para obtener la aceleración. Si necesita compatibilidad con versiones anteriores, debe utilizar UIWebView para iOS7 y versiones anteriores.

Configuré un pequeño código para proporcionar el marco UIViewController para el nuevo WKWebView. Se puede instalar a través de cocoapods. Echa un vistazo aquí:

STKWebKitViewController on github


Swift no es un requisito, todo funciona bien con Objective-C. UIWebView continuará siendo compatible, por lo que no hay prisa por migrar si desea tomarse su tiempo. Sin embargo, no obtendrá las mejoras de rendimiento de desplazamiento y javascript de WKWebView.

Para compatibilidad con versiones anteriores, tengo dos propiedades para mi controlador de vista: un UIWebView y un WKWebView. Utilizo WKWebview solo si la clase existe:

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

Mientras que solía tener un UIWebViewDelegate, también lo hice un WKNavigationDelegate y creé los métodos necesarios.


Utilice algunos patrones de diseño, puede mezclar UIWebView y WKWebView. El punto clave es diseñar una interfaz de navegador única. Pero debe prestar más atención a la funcionalidad actual de su aplicación, por ejemplo: si su aplicación usa NSURLProtocol para mejorar la capacidad de la red, usando WKWebView no tiene oportunidad de hacer lo mismo. Debido a que NSURLProtocol solo afecta el proceso actual, y WKWebView utiliza una arquitectura de proceso múltiple, el personal de redes se encuentra en un proceso separado.


WKWebView usando Swift en iOS 8 ...

El archivo completo de ViewController.swift ahora se ve así:

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


WkWebView es mucho más rápido y confiable que UIWebview según los documentos de Apple . Aquí, publiqué mi 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() } }


UIWebView seguirá trabajando con las aplicaciones existentes. WKWebView está disponible a partir de iOS8 , solo WKWebView tiene un motor Nitro JavaScript.

Para aprovechar este motor de JavaScript más rápido en aplicaciones antiguas, debe hacer cambios en el código para usar WKWebView lugar de UIWebView . Para iOS7 y iOS7 anteriores, debe seguir utilizando UIWebView , por lo que es posible que tenga que buscar iOS8 y luego aplicar los métodos de WKWebView / delegate y el retorno a los métodos de UIWebView para iOS7 y UIWebView anteriores. Además, no hay ningún componente de Interface Builder para WKWebView (todavía), por lo que debe implementar WKWebView programación.

Puede implementar WKWebView en Objective-C, aquí hay un ejemplo simple para iniciar un 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 rendimiento de la representación de WKWebView es notable en los juegos de WebGL y algo que ejecuta algoritmos complejos de JavaScript. Si está utilizando webview para cargar un html o sitio web simple, puede continuar utilizando UIWebView .

Aquí hay una app prueba que se puede usar para abrir cualquier sitio web usando UIWebView o WKWebView y usted puede comparar el rendimiento y luego decidir actualizar su aplicación para usar WKWebView : app


Paso: 1 Importar webkit en ViewController.swift

import WebKit

Paso: 2 Declara la variable de webView.

var webView : WKWebView!

Paso: 3 Agregar Delegado de WKNavigationDelegate

class ViewController: UIViewController , WKNavigationDelegate{

Paso: 4 Agregar código en 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)

Paso: 5 Editar la info.plist añadiendo

<dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <key>google.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict>


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)