iPad、Catalyst、MacOS 中的WkWebview 在加载部分url时,会遇到部分按钮点击无效(a标签target = _blank),或者加载不出来的问题(无限重定向)
加载白屏
在使用模拟器 iPad、Catalyst、MacOS端的WKWebview时,例如请求url https://www.baidu.com ,那么会发现无法加载页面,调试发现其后台在不停的重定向,无法正常加载url
<head>
<script>
location.replace(location.href.replace("https://","http://"));
</script>
</head>
此时我们可以用修改userAgent的方式来避免这个问题:
NSString *userAgent;
// iPhone
userAgent = @"Mozilla/5.0 (iPhone; CPU iPhone OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4";
// Chrome
userAgent = @" Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36";
// Safari
userAgent = Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Safari/605.1.15
直接赋值
_wkWebView.customUserAgent = userAgent;
或者
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = userContentController;
configuration.applicationNameForUserAgent = userAgent;
self.webView = [[WKWebView alloc] initWithFrame:[UIScreen mainScreen].bounds configuration:configuration];
_blank 点击无效
解决方式
核心点在于点击按钮后的 回调 decidePolicyForNavigationAction,有2种修改方式
-
删除所有a标签的 target属性
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ // WKNavigationAction 中有两个属性:sourceFrame和targetFrame,分别代表这个action的出处和目标。 // WKFrameInfo有一个 mainFrame 的属性,正是这个属性标记着这个frame是在主frame里还是新开一个frame。 if (!navigationAction.targetFrame.isMainFrame) { [webView evaluateJavaScript:@"var a = document.getElementsByTagName('a');for(var i=0;i<a.length;i++){a[i].setAttribute('target','');}" completionHandler:nil]; } decisionHandler(WKNavigationActionPolicyAllow); }
-
根据点击的url 重新加载webview
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { WKFrameInfo *frameInfo = navigationAction.targetFrame; if (![frameInfo isMainFrame]) { [webView loadRequest:navigationAction.request]; } return nil; }
注意点
需要处理自动弹出的视频、返回键等问题
阅读量
loading...