2009-08-07 17 views
6

Ho un UIWebView che sto usando come browser incorporato nella mia app.Aprire i collegamenti popup in UIWebView, possibile?

Ho notato che i collegamenti nelle pagine Web che aprono nuove finestre vengono ignorati senza alcuna chiamata nel mio codice.

Ho provato breakpointing su

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

e quindi selezionando un link che avrebbe aperto una finestra pop-up, e il punto di interruzione è mai colpito. C'è qualcosa che posso fare per intercettare quella selezione del collegamento popup e ottenere l'URL e caricarlo normalmente?

Non sono interessato a visualizzare una finestra popup nell'app stessa, voglio solo l'URL di qualunque cosa verrà caricata nella finestra popup per caricare la stessa webview principale.

È possibile?

Grazie!

risposta

7

Mi sono imbattuto anche in questo, e la riscrittura dell'HTML era la soluzione migliore che avrei potuto trovare. Il problema più grande che ho incontrato con questo approccio è che il browser web è interattivo per un paio di secondi fino a quando non viene chiamato il metodo webViewDidFinishLoad: in questo modo i collegamenti sembrano essere interrotti per alcuni secondi fino a quando non vengono riscritti.

Sono tre le aree che ho riscritto: collegamenti, messaggi di moduli e chiamate a window.open().

Ho utilizzato un approccio simile al primo codice snippato nella risposta Jasarian's per sovrascrivere la destinazione per collegamenti e moduli mediante iterazione su tag e moduli. Per ignorare window.open, ho usato il codice simile al seguente:

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

Quindi, dopo una piccola quantità di ricerche, è chiaro che la classe UIWebView ignora intenzionalmente i collegamenti che verranno aperti in una nuova finestra (utilizzando l'elemento 'destinazione' sul tag o utilizzando javascript nell'evento onClick).

Le uniche soluzioni che ho trovato sono di manipolare l'html di una pagina usando javascript. Mentre questo funziona per alcuni casi, non è a prova di proiettile. Ecco alcuni esempi:

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

Questo cambierà tutti i link che utilizzano l'elemento di 'target' per puntare a _self - invece di _blank o _new. Questo probabilmente funzionerà su tutta la linea e non presenterà alcun problema.

L'altro frammento di seguito ho trovato la stessa idea, ma con l'evento onClick:

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

Questo è semplicemente brutto. Funzionerà solo se il tag link ha impostato correttamente l'elemento href e solo se l'evento onclick viene utilizzato per aprire la nuova finestra (utilizzando window.open() o qualcosa di simile). I motivi per cui è antipatico non dovrebbero essere spiegati, ma un esempio potrebbe essere se onClick è usato per qualcosa di diverso dall'apertura di una finestra - che è un caso molto comune.

Immagino che si possa andare oltre con questo e iniziare a fare qualche abbinamento di stringhe con il metodo onClick, e cercare window.open(), ma di nuovo, questo è davvero lontano dall'ideale.

2

Ecco come ho link di Twitter al lavoro (vale a direlinkare a pagine che cercano di aprire nuove finestre):

-(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]; 
Problemi correlati