在app内打开网页,用UIWebview打开一个链接:1.在浏览器中打开时一切正常;
2.在UIWebview打开该链接时,点击A网页上的链接可以跳转到新的B页面,但是在B点击“撤回”时webview先是白屏一会接着就闪退了。
请问如何在uiwebview中实现类似浏览器的操作呢?
解答:
问题的核心有两个:
1.uiwebview不响应jS的window.close方法,解决办法是hack该方法,重写,代码如下(记得添加自己的处理方法,不然webview呈现空白的内容)
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *swizzleCloseWindowJS =
@"var script = document.createElement('script');"
"script.type = 'text/javascript';"
"script.text = \"window.close = function windowOnClose() { "
"javascript:window.location='hackCloseWindowFrame://'"
"}\";"
"document.getElementsByTagName('head')[0].appendChild(script);";
[webView stringByEvaluatingJavaScriptFromString:swizzleCloseWindowJS];
}
{
DDLogInfo(@"absolute url :%@",request.URL.absoluteString);
DDLogInfo(@"url scheme :%@",request.URL.scheme);
if ([request.URL.scheme isEqualToString:[@"hackCloseWindowFrame" lowercaseString]]) {
// 添加自己的处理方法
return NO;
}
return YES;
}
2.UIWebview加载错误,错误代码-999,这种错误通过查询其原因是:在前一个NSURLRequest还没有加载完成时开始加载新的NSURLRequest,一般的处理办法是检测到此类错误,在一下方法中添加自己的处理:
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
以上的解决办法个人觉得不算好的,只是暂时能解决问题,欢饮大牛给出更优的办法。