美文网首页
WKWebView Cookie管理与资源自定义

WKWebView Cookie管理与资源自定义

作者: bonoCat | 来源:发表于2017-09-08 17:30 被阅读1408次
    WebKit.jpeg

    为什么要用WKWebview?

    • 独立进程与APP进程相互隔离,与app同时运行,性能优势
    • 网页不用内容可以在不同网页进程独立运行,防止恶意网页攻击,更加安全
    • 与Safari 同样的 JavaScript 引擎, html 5 支持更好
    • 内存占用低

    由于 iOS11 之前版本都存在 cookie 无法共享,网址无法拦截,资源不能自定义等问题。现在 iOS 11 来了,解决了这些问题,而且苹果不断对它进行优化,替代UIWebview也指日可待。

    cookie 管理

    什么是cookie?

    网络请求中包含一小段数据(4K限制),就是cookie,用于追踪用户行为。

    WKHTTPCookieStore

    由于 WKWebview是独立进程的,所以,Cookies也是独立的,虽然可以通过JS的方法来获取cookie。但是跨站点cookie和 HTTP-only cookies却无能为力,这个时候就需要一套类似与NSHTTPCookieStore的管理工具。iOS 11中提供了这么一个类-WKHTTPCookieStore。

    • addObserver
    • removeObserver
    • setCookie
    • getAllCookie
    • deleteCookie

    demo

    
        WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
            
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{
                                                                        NSHTTPCookieDomain:@".baidu.com",
                                                                        NSHTTPCookieName:@"s",
                                                                        NSHTTPCookieValue:@"s1",
                                                                        NSHTTPCookiePath:@"/",
                                                                        NSHTTPCookieSecure:[NSNumber numberWithBool:YES]
                                                                        }];
            
        [cookieStore setCookie:cookie completionHandler:^{
                
            }];
    
    

    由于cookie设置不就是一个同步的操作, 需要等待它的完成。通过这种方式可以将NSHTTPCookieStore中的cookies设置到WKHTTPCookieStore中。

    过滤不需要的内容 - WKContentRuleList

    请求之前,对请求内容进行过滤,只需要通过json的简单配置即可实现。

    demo

    NSString *jsonString = @"[{\"trigger\": {\"url-filter\": \".*\"}, \"action\": { \"type\":\"make-https\" }}]";
        
    [WKContentRuleListStore.defaultStore compileContentRuleListForIdentifier:@"ContentBlockRules" encodedContentRuleList:jsonString completionHandler:^(WKContentRuleList *ruleList, NSError *error) {
            
            if (error) {
                
                return;
            }
            
        }];
        
    

    注意 encodedContentRuleList 的规则 在这里可以找到。上面例子的规则是实现了一个将http转换为https的请求,保证程序的安全性。

    自定义资源的能力 - WKURLSchemeHandler

    我们会有一些资源来源于本地,需要通过一种方式很好的处理与web之间的关系。iOS 11 提供的方法是 WKURLSchemeHandler ,通过注册scheme,来处理本地数据,再将数据返回给web。

    demo

    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
            
    [config setURLSchemeHandler:[[SchemeHandler alloc] init] forURLScheme:@"apple-local"];
            
    NSURL *url = [NSURL URLWithString:@"apple-local://www.baidu.com"];
    
    
    - (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask
    {
        UIImage *image = [UIImage imageNamed:@"photo"];
        NSData *data =  UIImageJPEGRepresentation(image, 1.0);
        
        [urlSchemeTask didReceiveResponse:[[NSURLResponse alloc] initWithURL:urlSchemeTask.request.URL MIMEType:@"image/jpg" expectedContentLength:data.length textEncodingName:nil]];
    
        [urlSchemeTask didReceiveData:data];
    
        [urlSchemeTask didFinish];
    }
    
    - (void)webView:(WKWebView *)webView stopURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask;
    {
        urlSchemeTask = nil;
    }
    

    以上是一些基本用法,上传一个demo

    相关文章

      网友评论

          本文标题:WKWebView Cookie管理与资源自定义

          本文链接:https://www.haomeiwen.com/subject/kqlnjxtx.html