OC

WKWebview模拟PC浏览器形式加载url

Posted on 2022-02-14,3 min read

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 点击无效

参考WKWebView遇到_blank的处理方法

解决方式

核心点在于点击按钮后的 回调 decidePolicyForNavigationAction,有2种修改方式

  1. 删除所有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);
    }
    
  2. 根据点击的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...