美文网首页
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