开发中遇到window.open造成的webview白屏问题

在一个H5嵌套项目中遇到这样一个问题,当我点击H5页面的某个按钮时,webview页面直接白屏了,开始我怀疑自己的代码是不是由于疏漏移除了WebView,当我用Safari打开调试模式发现,webView存在,内容变成了about:blank,由于我对H5不是很了解,所以请教了H5的开发,那边说就是正常的链接打开,并说在调试工具里面正常,尼玛~~~~。后来我直接在Safari打开H5页面,确实能正常显示,但是每次会在web页面打开一个新的tab,即新的窗口。这时我再问H5的开发同学,他才告诉我用的window.open方式打开的一个新的跳转链接,@#¥&%(##)。。。。于是原因找到了。进入正题,window.open,window.close在iOS中怎么去处理???

1、UIWebView处理方式

重写全局函数window.open 和 window.close.

NSString *js = @"window.open = function(url, d1, d2) { window.location = \"open://\" + url;}";

[webView stringByEvaluatingJavaScriptFromString:js];
NSString *js = @"window.close = function() {window.location.assign(\"back://\" + window.location);};";

[webView stringByEvaluatingJavaScriptFromString:js];

然后自己去实现open://  和 back:// 就可以了

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    
    NSString *requestURL = request.URL.absoluteString;
    if ([requestURL hasPrefix:@"open://"]) {
        //打开的处理
    } else if ([requestURL hasPrefix:@"back://"]) {
        //返回的处理
    }
}

2、WKWebView处理方式

在WK中,框架已经将这个问题简单化了,通过代理<WKUIDelegate>的方式告诉我们了,我们只需要在协议的实现中处理即可。

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures {

    //navigationAction 里面能得到链接、frame等信息,重点处理
    //如果不想跳转到新的窗口
    return nil; 
    //如果需要跳转新的窗口,重新实例化一个webview并将新的WebView返回即可。下面是伪代码,具体实现自己处理
    return [WKWebView new];
}

猜你喜欢

转载自blog.csdn.net/cjh965063777/article/details/82964556