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,

声明一些属性后面要用到

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


截取URL拼接方法:

代码

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])就是上一个界面的连接,最后重新加载完成。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容