iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回

需求须知:公司要将微信公众号里面的H5写成自家app ,当然首选使用wkwebview。我们的HTML是之前老员工写的离职后是一个小哥接手,这次写这个我们两个要密切配合才行。(对于大神来说不用看了,直接给我写正确的方法吧,不然巫了你的眼)。

问题:保持登录

方案一:使用oc回调js吧access_token传过去,后台那边自己保存判断使用,(当然这个首先后台那边知道如何写)我传过去了他不知道杂用很郁闷,简单说一下方法:

oc代码:

// NSString *jsStr =[NSString stringWithFormat:@"tokenResult('%@')",@"access_token"];

//    [webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {

//        NSLog(@"==%@----%@",result,error);

//    }];

h5代码:

function tokenResult(str){

        if(str == 'null'){

            alert(str);//这个str就是access_token

        } else {

            alert(str);

            window.webkit.messageHandlers.timeout.postMessage({body: ''});//这个是调取我这边的方法js调用oc

        }

    }

方案2:OC端每个请求后面拼接上access_token,

声明一些属性后面要用到

iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回_第1张图片

返回按钮的点击事件里面的代码


iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回_第2张图片

截取URL拼接方法:

iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回_第3张图片
iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回_第4张图片
iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回_第5张图片
代码

url截取的代码

#pragma mark = WKNavigationDelegate

// 在发送请求之前,决定是否跳转

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{


    NSLog(@"%@",navigationAction.request.URL.absoluteString);

    //允许跳转

    //decisionHandler(WKNavigationActionPolicyAllow);

    //不允许跳转

    //decisionHandler(WKNavigationActionPolicyCancel);

    NSString *hostname = navigationAction.request.URL.host.lowercaseString;

    NSLog(@"是否跨平台%@",hostname);

//    if (navigationAction.navigationType == WKNavigationTypeLinkActivated

//        && ![hostname containsString:@"m.shaimobao.com"]) {

//        // 对于跨域,需要手动跳转

//        [[UIApplication sharedApplication] openURL:navigationAction.request.URL];

//

//        // 不允许web内跳转

//        decisionHandler(WKNavigationActionPolicyCancel);

//    } else {

//        //self.progresslayer.alpha = 1.0;

//        decisionHandler(WKNavigationActionPolicyAllow);//允许跳转

//    }


#pragma mark - 截取连接并保存返回连接方法开始

    if (self.isbackbool) {//用户点击了返回按钮返回YES

        decisionHandler(WKNavigationActionPolicyAllow);

        self.isbackbool = NO;

    }else{//用户没有点击返回返回NO

        NSURL *URL = navigationAction.request.URL;

        MBLog(@"%@", URL);

        NSString * strurl = [NSString string];

        if (![[NSString stringWithFormat:@"%@",URL] isEqualToString:[NSString stringWithFormat:@"http://"]]) { // 不是主页 加载

            if (![[NSString stringWithFormat:@"%@",URL] isEqualToString:[NSString stringWithFormat:@"%@",self.currentUrl]]) {

                NSString *string = [NSString string];

                if ([[NSString stringWithFormat:@"%@",URL] containsString:@"access_token"]) {

                    NSLog(@"women 包含 bitch");

                    string = [NSString stringWithFormat:@"%@",URL];

                } else {

                    NSLog(@"women 不存在 bitch");

                    string =[NSString stringWithFormat:@"%@&access_token=%@",URL,[self.userdic objectForKey:@"access_token"]];

                }

                NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:string]];

                navigationAction = navigationAction;

                [webView loadRequest:request];

                self.currentUrl = URL;

                strurl = [NSString stringWithFormat:@"%@",URL];

                [self urlarrayisboolURL:strurl];


                decisionHandler(WKNavigationActionPolicyCancel); // 必须实现 取消加载 不然会加载2遍

                return;

            } else {

                self.currentUrl = URL;


                decisionHandler(WKNavigationActionPolicyAllow); // 必须实现 加载

                strurl = [NSString stringWithFormat:@"%@",URL];

                [self urlarrayisboolURL:strurl];

                return;

            }

        } else {

            self.currentUrl = URL;

            decisionHandler(WKNavigationActionPolicyAllow); // 必须实现 加载

            return;

        }

    }

#pragma mark - 截取连接并保存返回连接方法结束

}

-(void)urlarrayisboolURL:(NSString *)strurl{

    //保存请求的连接按顺序保存

    //首先判断数组中是否有该链接(只保存一次)

    BOOL isbool = [_urlArray containsObject: strurl];

    if (isbool) {//存在


    }else{//不存在

        //存进去

        if ([[NSString stringWithFormat:@"%@",strurl] containsString:@"access_token"]) {

            [self.urlArray addObject:strurl];

        } else {

            //NSLog(@"没有拼接的参数");

        }

    }

}

返回按钮代码

-(void)goback{

//    if ([webView canGoBack]) {

//        [webView goBack];

//        NSLog(@"back");

//    }

    if (self.urlArray.count < 1||self.urlArray.count == 1) {

        self.isbackbool = NO;


    }else{

        self.isbackbool = YES;//表示用户点击了返回按钮此时不应该在添加链接

        NSURL * url = [NSURL URLWithString:self.urlArray[self.urlArray.count - 2]];

        [webView loadRequest:[NSURLRequest requestWithURL:url]];

        [self.urlArray removeLastObject];


    }


    //    /*A*网页操控相关方法**/

    //    [self.webView goBack];    // 回退

    //    [self.webView goForward];  //前进

    //    [self.webView reload];      //刷新

    //设置是否能够前进和回退

    //    self.goBackBtn.enabled = webView.canGoBack;

    //    self.fowardBtn.enabled = webView.canGoForward;

}

实现思路说明:

1.在 【在发送请求之前,决定是否跳转decidePolicyForNavigationAction 】的方法中获取到用户点击的当前连接

2.判断当前连接是否已经拼接access_token,拼接之后保存当前self.currentUrl连接,然后再次发[webView loadRequest:request];重新加载,(为了防止循环,我们要判断,当前连接和将要加载的连接是否一样,要是一样就不用再次加载,不一样就再次loadRequest)。

3.重新加载的时候将当前正在加载的URL保存到self.urlArray数组中,为防止重复添加需要做一下判断,保证数组中的元素是唯一的(urlarrayisboolURL:(NSString *)strurl)。此时正面加载已经没有问题了。

4.返回上一个界面的的思路,定义一个bool值,yes为用户点击了返回按钮(返回的时候没有必要再截取URL)所以在【在发送请求之前,决定是否跳转decidePolicyForNavigationAction 】方法中判断一下。要是self.isbackbool为yes就直接WKNavigationActionPolicyAllow实现,不然就截取保存。

5.返回按钮中实现思路:首先去掉返回首页的情况或是首页的情况(及判断数组中连接的个数)。再次就是返回获取数组中倒数第二个元素(self.urlArray[self.urlArray.count - 2])就是上一个界面的连接,最后重新加载完成。

到这里就完成方法很笨,但是功能实现了  目前只能先这样交差 ,等后期有更好的专业的方法在替换。欢迎大神指导万分感谢。

你可能感兴趣的:(iOS WKWebView请求过程中拦截URL修改之后继续请求并且实现多级页面返回)