注意:这里使用undocumented api,使用该方法可能会影响您的product被AppStore拒绝上架!
也不记得最早是什么原因想去了解UIWebView的加载进度和加载时间了,只是前段时间看文档的时候发现WebKit里头有相关的API,所以就nm看了下UIKit中的UIWebView的方法列表,发现他果然使用这些方法。虽然说这些代理是属于WebKit中的方法,WebKit属于PrivateFramework,如果第三方应用使用WebKit铁定被拒绝的。但是UIWebView已经使用了这些代理,如果用继承的方式重写他的代理,那么还是有希望能够通过的,当然,我不保证,也不大关心。我只关心一种简单的查看网页加载进度和加载时间的方式。
我这里使用的方法是WebKit中关于加载资源的WebResourceLoadDelegate委托。 由于是API的使用,我就不详细介绍每个API的东西了,有兴趣的人自己看苹果官网的WebResourceLoadDelegate文档。我只简要介绍一下我使用的四个,以及分别我在这四个地方做了什么事情。
-webView:identifierForInitialRequest:fromDataSource: 每个资源请求都会走一次这个回调函数,所以在这个函数里可以统计这个页面一共有多少资源请求。 -webView:resource:didFinishLoadingFromDataSource: -webView:resource:didFailLoadingWithError:fromDataSource: 这两个方法是当一个资源请求加载完成或者失败的时候会被回调的,在这个函数里统计你已加载的资源。 用上面提到的回调,你就可以实现类似Opera浏览器的进度条“10/86”这样的进度了。 那么,怎么计算请求时间呢? 我这里采用的是,当开始loadRequest的时候,开始计算时间,当已加载的资源总数(包括成功和失败)等于网页中的资源请求总数时,就认为已经结束,计算一下时间使用,就是该页面的加载耗时。 那么剩最后一个问题,我如果在加载中间跳转到其他页面的话,这个时间该怎么算呢?这个就涉及到WebKit的另外的一些API了,这次就不讨论了。
不过Demo中我有使用一个将就的计时方式,就是当计时结束的时候,再收到一个资源请求的时候,我就认为是开启新的计时。如果是在网页加载途中请求新的页面,他的表现也凑合,虽然不大准确,因为会漏算刚开始的几个资源请求,详细可以看示例代码。 |
|