2009-08-07 19 views
6

Tengo un UIWebView que estoy usando como navegador integrado en mi aplicación.¿Es posible abrir enlaces emergentes en UIWebView?

He notado que los enlaces en las páginas web que abren nuevas ventanas se ignoran sin ninguna llamada a mi código.

He intentado breakpointing en

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

y luego seleccionar un enlace que abriría una ventana emergente, y el punto de interrupción no se ve afectado. ¿Hay algo que pueda hacer para interceptar esa selección del enlace emergente y obtener la URL y simplemente cargarla normalmente?

No me interesa mostrar una ventana emergente en la aplicación en sí, solo quiero que la URL de lo que se va a cargar en la ventana emergente se cargue en la propia vista web principal.

¿Esto es posible?

Gracias!

Respuesta

7

Me encontré con esto también, y la reescritura de HTML fue la mejor solución que pude encontrar. El mayor problema con el que me topé con ese enfoque es que el navegador web es interactivo por un par de segundos hasta que se llama al método webViewDidFinishLoad: por lo que los enlaces parecen estar rotos durante unos segundos hasta que se vuelven a escribir.

Hay tres áreas que reescribí: enlaces, publicaciones de formularios y llamadas a window.open().

Utilicé un enfoque similar al primer código recortado en Jasarian's respuesta para sobrescribir el destino de enlaces y formularios iterando sobre etiquetas y formularios. Para anular window.open, he utilizado un código similar al siguiente:

var oldWindowOpen = window.open; 
window.open = function(url, sName, sFeatures, bReplace) { 
    oldWindowOpen(url, '_self'); 
}; 
3

Luego de una pequeña cantidad de investigación, está claro que la clase UIWebView ignora deliberadamente los enlaces que se abrirán en una nueva ventana (ya sea utilizando el elemento 'objetivo' en la etiqueta a o usando javascript en el evento onClick).

Las únicas soluciones que he encontrado son manipular el html de una página usando javascript. Si bien esto funciona en algunos casos, no es a prueba de balas. He aquí algunos ejemplos:

links = document.getElementsByTagName('a'); 
for (i=0; i<links.length; i++) 
{ 
    links[i].target='_self'; 
} 

Esto va a cambiar todos los enlaces que utilizan el elemento 'objetivo' para apuntar a _self - en lugar de _blank o _new. Esto probablemente funcionará en todos los ámbitos y no presentará ningún problema.

El otro fragmento que encontré siguieron la misma idea, pero con el evento de clic:

links = document.getElementsByTagName('a'); 
for (i=0; i<links.length; i++) 
{ 
    links[i].onclick=''; 
} 

Ésta es simplemente repugnante. Solo funcionará si la etiqueta de enlace tiene su elemento href correctamente configurado, y solo si el evento onclick se usa para abrir la nueva ventana (usando window.open() o algo similar). Las razones por las que es desagradable no deberían necesitar explicaciones, pero un ejemplo sería si onClick se utiliza para otra cosa que abrir una ventana, que es un caso muy común.

Supongo que uno podría ir más allá con esto y comenzar a hacer algunas coincidencias de cadenas con el método onClick, y buscar por window.open(), pero nuevamente, esto está realmente lejos de ser ideal.

2

Así es como me sale enlaces de Twitter para trabajar (es decir,enlaces a páginas que tratan de abrir con nuevas ventanas):

-(BOOL)webView:(UIWebView *)mainWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     //Allows for twitter links 
     [self.mainWebView loadRequest:request]; 
     return NO; 
    } 

    return YES; 

} 
0
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init]; 
    theConfiguration.preferences.javaScriptCanOpenWindowsAutomatically = YES; 

    webView1 = [[WKWebView alloc] initWithFrame:self.webView.frame configuration:theConfiguration]; 
    webView1.navigationDelegate = self; 
    webView1.UIDelegate = self; 
    [self.view addSubview:webView1]; 

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
     NSString *htmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 
     NSLog(@"htmlString: %@", htmlString); 
     [webView1 loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"your url"]; 
    }]; 

    [dataTask resume]; 
Cuestiones relacionadas