为什么要用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
网友评论