iOS中WKWebView的一些特殊使用总结

iOS中WKWebView的一些特殊使用总结,第1张

概述iOS中WKWebView的一些特殊使用总结 前言 现在大部分的app只支持iOS8以上的系统了,在接入H5时可以只管最新的WKWebView了. WKWebView的优势 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷新频率(不卡) 本文将给大家总结下iOS中WKWebView的一些特殊使用,下面话不多说了,来一起看看详细的介绍吧 WKWebView 加载本地网页的方式 1.直接加载字符串 - (void)loadHT

前言

现在大部分的app只支持iOS8以上的系统了,在接入H5时可以只管最新的WKWebVIEw了。

WKWebVIEw的优势

性能高,稳定性好,占用的内存比较小,支持Js交互支持HTML5 新特性可以添加进度条(然并卵,不好用,还是习惯第三方的)。支持内建手势,据说高达60fps的刷新频率(不卡)

本文将给大家总结下iOS中WKWebVIEw的一些特殊使用,下面话不多说了,来一起看看详细的介绍吧

WKWebVIEw 加载本地网页的方式

1.直接加载字符串

- (voID)loadHTMLString {//直接加载字符串Nsstring *path = [[NSBundle mainBundle] pathForResource:@"story" ofType:nil];Nsstring *body = [Nsstring stringWithContentsOfURL:[NSURL fileURLWithPath:path] enCoding:(NSUTF8StringEnCoding) error:nil];Nsstring *csspath = [[NSBundle mainBundle] pathForResource:@"CSS" ofType:nil];Nsstring *CSS = [Nsstring stringWithContentsOfURL:[NSURL fileURLWithPath:csspath] enCoding:NSUTF8StringEnCoding error:nil];Nsstring *HTML = @"<HTML>";HTML = [HTML stringByAppendingString:@"<head>"];HTML = [HTML stringByAppendingString:@"<Meta name=\"vIEwport\" content=\"wIDth=device-wIDth,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,vIEwport-fit=cover\">"];HTML = [HTML stringByAppendingString:@"<style type=\"text/CSS\">"];HTML = [HTML stringByAppendingString:CSS];HTML = [HTML stringByAppendingString:@"</style></head><body>"];HTML = [HTML stringByAppendingString:body];HTML = [HTML stringByAppendingString:@"</body></HTML>"];[webvIEw loadHTMLString:HTML baseURL:nil];}

需要注意的是, baseURL 可以用来控制请求权限

2.加载本地文件

- (voID)loadHTMLContent {//加载本地文件Nsstring *rootPath = [NSHomeDirectory() stringByAppendingPathComponent:@"documents"];NSURL *rootURL = [NSURL fileURLWithPath:rootPath];Nsstring *bodyTargetPath = [rootPath stringByAppendingPathComponent:@"index.HTML"];NSURL *url = [NSURL fileURLWithPath:bodyTargetPath];//这里必须指定到沙盒的具体文件夹,不能再沙盒根目录上[webvIEw loadfileURL:url allowingReadAccesstoURL:rootURL];}

重定向请求

1.通过 URLProtocol

新建 Protocol 的子类,并添加请求属性

@property (nonnull,strong) NSURLSessionDataTask *task;

由于 WKWebvIEw 的特殊性,这里需要新建类别,并注册需要监听的请求头 [NSURLProtocol wk_registerScheme:@"http"];

注册监听 [NSURLProtocol registerClass:[BZURLProtocol class]];

过滤需要进行处理的请求,同时也要过滤那些已经处理过的请求。

+ (BOol)canInitWithRequest:(NSURLRequest *)request {if ([request.URL.absoluteString containsstring:@"localhost"]) {//看看是否已经处理过了,防止无限循环if ([NSURLProtocol propertyForKey:kBZURLProtocolKey inRequest:request]) {return NO;}return YES;}return NO;}

将请求通过下面的方法,进行重新组装,设置成我们自己的请求

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request

将上面组装好的请求,通过下面的方法发出。并在这里将发出的请求,进行标记,因为会重走流程,避免循环处理

- (voID)startLoading {NSMutableURLRequest *mutableReqeust = [[self request] mutablecopy];//给我们处理过的请求设置一个标识符,防止无限循环,[NSURLProtocol setProperty:@YES forKey:kBZURLProtocolKey inRequest:mutableReqeust];NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];self.task = [session dataTaskWithRequest:self.request];[self.task resume];}

这里通过 task 来进行网络请求发送,也可以在这里进行请求的缓存处理,加快访问

最后需要设置代理方法,保证请求被允许和接收到数据后的加载

- (voID)URLSession:(NSURLSession *)sessiondataTask:(NSURLSessionDataTask *)dataTaskdIDReceiveResponse:(NSURLResponse *)responsecompletionHandler:(voID (^)(NSURLSessionResponsedisposition))completionHandler {//允许请求加载[[self clIEnt] URLProtocol:self dIDReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];completionHandler(NSURLSessionResponseAllow);}- (voID)URLSession:(NSURLSession *)sessiondataTask:(NSURLSessionDataTask *)dataTaskdIDReceiveData:(NSData *)data {//加载数据[[self clIEnt] URLProtocol:self dIDLoadData:data];}

停止请求的时候注意销毁对象

- (voID)stopLoading {if (self.task != nil) {[self.task cancel];}}

退出的时候也要注意移除监听

[NSURLProtocol wk_unregisterScheme:@"http"];[NSURLProtocol unregisterClass:[BZURLProtocol class]];

2.通过第三方库 GCDWebServer 处理请求

建立 server 要在发出请求之前

server = [[GCDWebServer alloc] init];

添加监控方法,这里提供了很多种选择,包含了请求方式和异步同步回调等,这里选择了 GET 方法和异步回调。拿到结果后将其回调给 server ,完成重定向

//异步请求函数[server addDefaultHandlerForMethod:@"GET"requestClass:[GCDWebServerRequest class]asyncProcessBlock:^(__kindof GCDWebServerRequest * _Nonnull request,GCDWebServerCompletionBlock _Nonnull completionBlock) {if ([request.URL.absoluteString containsstring:@"localhost"]) {//命中了需要特殊处理的请求,这里进行特定 *** 作NSURL *url = [NSURL URLWithString:@"http://m.baIDu.com/static/search/baIDuapp_icon.png"];NSURLRequest *request = [NSURLRequest requestWithURL:url];NSURLSession *session = [NSURLSession sharedSession];//发出请求NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data,NSURLResponse * _Nullable response,NSError * _Nullable error) {if (data && error == nil) {//接收到正确的数据,并返回给serverGCDWebServerDataResponse *response = [GCDWebServerDataResponse responseWithData:data ContentType:@"image/jpeg"];completionBlock(response);} else {//数据请求失败,返回给server一个空的或者失败的结果GCDWebServerDataResponse *response = [GCDWebServerDataResponse response];completionBlock(response);}}];[task resume];}}];

开启 server [server start];

最后是发出请求,否则会发生监控不生效的问题

 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

总结

以上是内存溢出为你收集整理的iOS中WKWebView的一些特殊使用总结全部内容,希望文章能够帮你解决iOS中WKWebView的一些特殊使用总结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1108029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存