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í:
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)