关闭

js与oc交互以及cookie设置 UIWebView与WKWebview兼容

标签: ocjs交互cookiecacheUIWebView与WKWebView
1119人阅读 评论(2) 收藏 举报
分类:

本文是我的学习总结 希望对后来学习这一方面的同学有所帮助

UIWebview与js传值方式有两种

第一种是为js注入对象的方式

   //这种方法是给js注入SMJSExportFunction对象实现

- (void)webViewDidFinishLoad:(SMWebView *)webView{

        self.context = [webView.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

                SMJSExportFunction *exportFunction =[SMJSExportFunctionnew];

                exportFunction.delegate=self;

                self.context[@"wobridge"]=exportFunction;//wobridge为js对象

}

对应的js中应有wobridge对象接受,注入成功后即可用wobridge调用oc本地方法,本地创建SMJSExportFunction实现

JSExport协议

第二种方式  JSExport协议关联 native 的方法

- (void)webViewDidFinishLoad:(SMWebView *)webView{

  self.context = [webView.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];


    self.context.exceptionHandler =

        ^(JSContext *context, JSValue *exceptionValue)

        {

            context.exception = exceptionValue;

            NSLog(@"%@", exceptionValue);

        };

        self.context[@"native"] = self;//关联native

        //js中调用sumit方法将在此处响应

        self.context[@"submit"] =

        ^(id dic)

        {

            dispatch_async(dispatch_get_main_queue(), ^{

                UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"msg from js" message:@"ll" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];

                [alert show];

            });

        };

}

WKWebView传值方式首先需要js注入TestModel对象,这样js可以通过

 window.webkit.messageHandlers.TestModel.postMessage()通知传值

下为添加对象方法

   SMScriptMessageDelegate *sDelegate=[[SMScriptMessageDelegatealloc] initWithDelegate:(id)self]; 

  [self.webViewaddScriptMessageHandler:sDelegatename:@"TestModel"];

 jsoc传值再此实现方法调用

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

关于cache WK不支持NSURLCache,所以无法截取网络连接 替换cache内容

UIWebView截取cache首先需要设置

[NSURLCachesetSharedURLCache:cache]

关于cookie

UIWebView支持NSHTTPCookieStorage可以通过

   NSArray *cookies = [[NSHTTPCookieStoragesharedHTTPCookieStorage] cookiesForURL:[NSURLURLWithString:@"www.baidu.com"]];//此处链接应为你的项目ip

        for (NSHTTPCookie *cookiein cookies){

            NSArray *headeringCookie = [NSHTTPCookiecookiesWithResponseHeaderFields:[NSDictionarydictionaryWithObject:[[NSStringalloc] initWithFormat:@"%@=%@",[cookiename],[cookie value]]forKey:@"Set-Cookie"]forURL:[NSURLURLWithString:@"www.baidu.com"]];

            [[NSHTTPCookieStoragesharedHTTPCookieStorage] setCookies:headeringCookieforURL:[NSURLURLWithString:@"www.baidu.com"]mainDocumentURL:nil];

        }

来设置cookie需要共用

WKWebView如果需要设置cookie  需要通过注入js方法设置实现

 [_webViewaddUserScriptWithJS:[NSStringstringWithFormat:@"document.cookie=\'%@\'",[NSStringstringWithFormat:@"JSESSIONID=272173718"]]injectionTime:WKUserScriptInjectionTimeAtDocumentStartforMainFrameOnly:NO];

各个wk之间共用cookie需要共用WKProcessPool这个文件管理池来实现

 if ([SMWebviewManagershareManager].processPool) {

        configuration.processPool=[SMWebviewManagershareManager].processPool;

    }else{

        WKProcessPool *processPool=[[WKProcessPoolalloc] init];

        [SMWebviewManagershareManager].processPool=processPool;

    }

上面是我近段时间学习js与oc交互的总结,一些简单知识,或许对大家有所帮助,详细代码    

https://github.com/lixuepeng996/SMWebView


2
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1123次
    • 积分:23
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档