为什么是WebView
WebAPP所显示的Web页面都是由一个叫做WebView的组件渲染出来的,每个网页都有一个链接即URL,首先将URL转换成NSURLRequest,然后用加载网页的类WebView加载Request,利用- (void)loadRequest:(NSURLRequest )request这个方法,就能将网页加载显示出来。
目前iOS中有两个加载网页的类,分别是UIWebView和WKWebView,UIWebView是UIKit框架中的一个类,而WKWebView是WebKit框架中的类,从性能上来说WKWebView的性能高、稳定性好、占用内存小,完备优于UIWebView。但由于WKWebView是iOS8供应的组件,因此系统版本低于iOS 8.0的iPhone/iPad用户就无法正常利用WKWebView组件开拓出来的APP。以是目前大部分开拓职员还在利用性能、稳定性并不理想的UIWebView进行WebAPP开拓,而本文所说的云聪慧透视宝WebView性能监控也因此UIWebView为紧张优化目标。
要进行性能监控必须得到WebAPP页面加载全过程的性能数据,透视宝是通过向当前加载链接的html5、jsp、php网页代码中注入获取数据的JS代码,然后通过OC与JS交互,将数据通报给OC,然后再将数据整理发送到透视宝后端。
监控哪些WebView性能数据
透视宝能监控四大类数据:
行为数据:抓取用户在移动端网页点的行为操作,也便是点击网页的内容,剖析用的户行为
韶光相应数据:分解一个链接从加载开始到完成这段韶光内,每个阶段的耗时
Ajax要求数据:抓取终端用户相应韶光,相应数据下载韶光,数据相应成功的callback实行韶光和ajax缺点数据
JS缺点数据:抓取加载链接的代码缺点信息
①韶光相应数据及数据打算公式
拜会上图,JS传给透视宝的韶光相应数据便是这些字段,个中navigationStart是出发点,所有的打算都须要依赖与它。剖析移动端H5性能数据,实在便是测算HTML5、JSP、PHP等网页元素在iOS上加载的韶光是非,通过这些性能数据前段开拓职员能够准确创造性能问题并及时办理,下表是透视宝定义的相应韶光分解数据及打算方案:
②资源时序数据
每一个网页都是有很多资源组成的,包括.js、.png、.jpg、.css、script等,每一个元素的加载都须要加载韶光,资源时序数据便是准确记录每一个元素的加载韶光及类型,并把这些数据通过JS的performance接口直接得到并传给OC,不须要打算。
③JS缺点及ajax要求数据
JS缺点指的是抓取网页代码的缺点,包括缺点类型及堆栈信息,直接定位缺点。ajax要求的数据有要求的链接、uri、终端用户相应韶光,相应数据下载韶光,数据相应成功的callback实行韶光和ajax缺点数据。JS缺点和ajax要求数据都是有JS代码直接获取到,不须要处理。
JS代码注入
想要准确监测网页性能就须要进行代码注入,而只有拿到网页的代码才能注入,UIWebView这个类里面除了三个加载链接的方法和4个代理方法,就没有其他内容了,而这些方法并不能获取到内容,以是我们就须要考虑其他方法。UIWebView在加载拦截的时候会进入NSURLProtocol这个类,而恰好这个类能拿到当前加载链接NSURLRequest,而且会走进这个类的- (void)startLoading方法,这个方法在页面load完成之前,页面刚加载之后,以是便是我们所须要的。
创建一个类,继续NSURLProtocol这个类,重写startLoading方法,由于能拿到链接的request,以是我们就对这个链接发送要求,用原生态的NSURLConnection或者NSURLSession都可以,我们用的NSURLConnection这个类发送要求并设置代理,方法是这个- (nullableinstancetype)initWithRequest:(NSURLRequest)request delegate:(nullableid)delegate startImmediately:(BOOL)startImmediately,
NSURLConnection的代理方法中有一个能接管要求链接数据的方法,- (void)connection:(NSURLConnection )connection didReceiveData:(NSData )data,得到的NSData是16进制的字节流数据,通过utf8转码将字节流转换成字符串,然后创造这个字符串恰好是这个当前加载网页的代码,
网页代码都是由标签组成,都会有这个标签,我们就把JS代码注入到标签之下,放在自己添加的
声明:IT之家网站刊登/转载此文出于通报更多信息之目的,并不虞味着赞许其不雅观点或论证其描述。